浅谈AngularJS中的$parse和$eval

AngularJS中$parse与$eval详解

$parse和$eval都是用来将表达式转为一个函数

$evalscope的一个方法,$parse是一种全局可以使用的服务。

从api可以看出来$eval是一种使用当前上下文的特殊$parse


// `$parse`

$parse(expr)(context, locals);

// `$eval`: 
//      expr:要解析的表达式 
//      locals:上下文  

function(expr, locals) {
        return $parse(expr)(this, locals);
      }

使用


<!DOCTYPE html>
<html ng-app="App">
    <head>
        <meta charset="utf-8">
        <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
    </head>
    <body ng-controller="Ctrl">
        <div>{{sayName}}</div>
        <script>
            angular.module("App", []).controller("Ctrl", ["$scope","$parse",function($scope,$parse) {
                        
                        var context = {
                            "name":"tom"
                        };
                
                        $scope.name = "chenjy";
                        
                        // ------------- 1 -------------
                        $scope.sayName = $parse("'my name is '+ name")(context)
                        // outPut: my name is tom
                        
                        // ------------- 2 -------------
                        $scope.sayName = $parse("'my name is '+ name")($scope)
                        // outPut: my name is chenjy
                        
                        // ------------- 3 -------------
                        $scope.sayName = $parse("'my name is '+ name")()
                        // outPut: my name is 
                        
                        // ------------- 1 -------------
                        $scope.sayName = $scope.$eval("'my name is '+ name");
                        // outPut: my name is chenjy
                        
                        // ------------- 2 -------------
                        $scope.sayName = $scope.$eval("'my name is '+ name",context);
                        // outPut: my name is tom
                        
                    }]);
        </script>
    </body>
</html>

我们用添加一个可以修改表达式的input,并且监听表达式当值发生变化重新解析


<!DOCTYPE html>
<html ng-app="App">

    <head>
        <meta charset="utf-8">
        <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
    </head>

    <body ng-controller="Ctrl">
        <div>{{sayName}}</div>
        <input type="text" ng-model="expr" />
        <script>
            angular.module("App", []).controller("Ctrl", ["$scope", "$parse", function($scope, $parse) {

                $scope.con = {
                    "name": "tom",
                    "myname": "chenjy"
                };

                $scope.expr = "'my name is '+ con.name";
                $scope.sayName = $parse($scope.expr)($scope)

                $scope.$watch("expr", function(newValue, oldValue, context) {
                    if(newValue !== oldValue) {
                        $scope.sayName = $parse(newValue)(context)
                    }
                });

            }]);
        </script>
    </body>
</html>

other

监听enter按键事件


<!DOCTYPE html>
<html ng-app="App">
    <head>
        <meta charset="utf-8">
        <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
    </head>
    <body ng-controller="Ctrl">
        <input type="text" ng-enter="enterEvent()">
        <script>
            angular.module("App", []).controller("Ctrl", ["$scope", "$parse", function($scope, $parse) {

                $scope.enterEvent = function() {
                    console.log("Press Enter!");
                };
            }]).directive('ngEnter', ["$parse", function($parse) {
                return function(scope, element, attrs) {
                    element.bind("keydown keypress", function(event) {
                        console.log(event);
                        if(event.which === 13) {
                            scope.$apply(function() {
                                scope.$eval(attrs.ngEnter);
                                /*$parse(attrs.ngEnter)(scope);*/
                            });
                            event.preventDefault();
                        }
                    });
                };
            }]);
        </script>
    </body>
</html>

转载于:https://www.cnblogs.com/chenjy1225/p/9851770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值