我正在查看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