zoukankan      html  css  js  c++  java
  • 浅谈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>
    
    
  • 相关阅读:
    create_pascal_tf_record.py 生成的record一直为0字节
    移植别人的vcpkg包到自己的项目
    评价目标检测(object detection)模型的参数:IOU,AP,mAP
    python 当文件目录不存在时,如何自动创建
    Spring validator常用注解
    @Slf4j的使用
    spring @Validated 注解开发中使用group分组校验
    @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常==》记录
    idea 创建各种类型项目(pom,jar.web)
    Linux下RabbitMQ服务器搭建
  • 原文地址:https://www.cnblogs.com/chenjy1225/p/9851770.html
Copyright © 2011-2022 走看看