任何人都可以解释这一小段代码吗?

时间:2014-07-02 20:31:27

标签: javascript angularjs angularjs-directive

我正在查看ng-blur的一个自定义实现(我知道它现在已经在标准的AngularJS中可用)。最后一行是我不明白的。

.controller('formController', function($scope){

$scope.formData = {};

$scope.myFunc = function(){
    alert('mew');
    console.log(arguments.length);
}
})
.directive('mew', function($parse){
      return function(scope, element, attr){
        var fn = $parse(attr['mew']);
        element.bind('blur', function(event){
            scope.$apply(function(){
                fn(scope);
            });
        });
    }
});

在视图中,有一个简单的mew="myFunc()"应用于输入。

我的问题是为什么我们将范围传递给指令最后一行的函数。我试图让它在没有它的情况下工作,但它没有。实际发生了什么?

这也有效scope.$apply(attr.mew)。相同的原因或不同的东西?

2 个答案:

答案 0 :(得分:0)

$parse只执行 ,它解析传入的字符串,你需要用当前作用域调用结果函数,否则它怎么知道要调用哪个函数?

scope.$apply按以下方式运作:

  
      
  1. 使用$eval()方法执行表达式。
  2.   
  3. 执行表达式的任何异常都会转发到$exceptionHandler服务。
  4.   
  5. 使用$digest()方法执行表达式后,会立即触发监听侦听器。
  6.   

scope.$apply(attr.mew)的原因是由于它正在完成上述所有操作。它正在解析,然后将解析的结果应用于范围。

另一种选择是使用隔离范围将您的指令绑定到mew attr。

   return {
        scope: {
            mew: '&'
        },
        link: function (scope, element, attr) {
            var fn = scope.mew;
            element.bind('blur', function (event) {
                scope.$apply(function () {
                    fn();
                });
            });
        }
    }

Example

答案 1 :(得分:0)

对于这个具体的例子,它会起作用,但正如你所说,模糊不在摘要循环中。在大多数用例中,该函数将更改一个或另一个范围内的数据,并且摘要循环应该运行并捕获这些更改。