指令中的调用控制器方法适用于作用域,但不适用于 attr


我想在

指令完成 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)将不起作用,因为您的指令正在使用隔离作用域。

最新更新