我正在查看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)。相同原因还是不同原因?

最佳答案

$parse只是这样做,它解析传入的字符串,您需要使用当前范围调用结果函数,因为否则它将如何知道要调用哪个函数?

scope.$apply以以下方式工作:


  
  该表达式使用$eval()方法执行。
  执行表达式时发生的任何异常都将转发到$exceptionHandler服务。
  使用$digest()方法执行表达式后,将立即激发监视侦听器。
  


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

09-25 16:57