指令完成 DOM 中的更改后调用控制器的方法,但它不起作用,所以我在指令中发送该方法,该方法在scope.$watch
内调用
.directive('checkThis', function($timeout) {
return {
restrict: 'E',
scope: {
myData: '=',
dirty: '=',
what: '@',
callback: '&'
},
link: function(scope, element, attrs) {
scope.$watch('myData', function(newValue, oldValue) {
if (newValue !== oldValue) {
if (newValue) {
scope.dirty++;
} else {
scope.dirty--;
}
check();
}
});
var check = function () {
if (angular.isDefined(scope.callback)) {
$timeout(function() {
console.log('being called');
scope.callback();
}, 0, false);
}
};
}
};
});
并在 HTML 中使用此指令,如下所示
<check-this my-data="vm.encryption" dirty="vm.dirty" what="column" callback="vm.checkAll()"></check-this>
现在当我使用 attrs.callback
它没有被执行,但即使我检查它attrs.callback
它在控制台中显示该方法scope.callback()
也会执行。
为什么会有这种行为?
甚至我尝试了scope.$eval(attrs.callback)
和
scope.$apply(function() {
scope.$eval(attrs.callback);
});
但它没有被召唤。我参考这篇文章
Angular 指令attrs
是字符串,因此调用 attrs.callback
是示例中'vm.checkAll()'
的字符串。使用 $eval
可以工作,但不建议这样做,因为它可能对应用程序的安全性有害。
解决方案是使用 scope.callback()
,您有什么理由不想使用它吗?
如果由于某种原因你绝对需要使用attrs.callback
,你可以使用scope.$parent.$eval(attrs.callback);
或eval('scope.$parent.' + attrs.callback)
,因为它们将在父作用域中评估vm.checkAll()
。
scope.$eval(attrs.callback)
将不起作用,因为您的指令正在使用隔离作用域。