深度监视属性传递给指令

时间:2016-09-26 10:36:40

标签: angularjs

我有一个指令,我正在传递一个动态构建的对象:

<my-directive passed-value="ctrl.buildValue()"></my-directive>

angular
.module('myModule')
.directive('myDirective', function () {
    return {
        restrict: 'E',
        scope: {
            passedValue: '='
        },
        controllerAs: 'ctrl',
        bindToController: true,
        templateUrl: 'templates/my-directive.html',
        controller: function () {
            var that = this;
        }
    };
}]);

假设对象始终是一个新对象,但对象属性永远不会改变,例如:

myController.buildValue = function() {
    return {someValue: 'abcd'}
};

然后angular进入无限循环,因为(我认为)返回的对象总是一个新对象。

那么,即使对象是新的,如果对象是新的,我怎么能要求angular认为对象没有改变?

应该可以,因为我知道当我深入观察一个物体(使用$watch(..., true))时,如果物体的属性相同,则角度会认为该物体是相同的,即使该物体总是一个新物体之一。

1 个答案:

答案 0 :(得分:0)

您最好不要在passed-value属性中使用方法,即使它返回一个对象。因为您将该属性定义为:

scope: {
    passedValue: '='
}

期待完全是一个对象。

问题的原因是AngularJS会在每次更改时刷新页面的各个部分。因此,即使该方法返回一个对象,它也会运行几乎无限次。

我建议您将对象变量绑定到该属性。例如,在控制器中创建一个变量,通过您的方法初始化它:

vm.myValue = vm.buildValue();

然后,将此参数传递给您的指令:

<my-directive passed-value="ctrl.myValue"></my-directive>