Angularjs 在指令中调用控制器方法适用于范围,但不适用于属性?

Angularjs 在指令中调用控制器方法适用于范围,但不适用于属性?,angularjs,directive,Angularjs,Directive,我想在指令完成DOM中的更改后调用控制器的方法,但该方法不起作用,因此我在指令中发送该方法,该方法在范围内调用。$watch .directive('checkThis', function($timeout) { return { restrict: 'E', scope: { myData: '=', dirty: '=', what: '@', callb

我想在指令完成DOM中的更改后调用控制器的方法,但该方法不起作用,因此我在指令中发送该方法,该方法在
范围内调用。$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
是字符串,因此调用
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)
将不起作用,因为您的指令正在使用隔离作用域

您只需调用
scope.$eval(attrs.callback)
;无需在其中连接
$scope.
。感谢您的评论。虽然您没有完全正确(因为隔离范围,需要
$parent
),但您确实帮助我认识到了我的错误。答案已经确定。
 scope.$apply(function() { 
    scope.$eval(attrs.callback); 
 });