我有一个指令,我正在传递一个动态构建的对象:
<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)
)时,如果物体的属性相同,则角度会认为该物体是相同的,即使该物体总是一个新物体之一。
答案 0 :(得分:0)
您最好不要在passed-value
属性中使用方法,即使它返回一个对象。因为您将该属性定义为:
scope: {
passedValue: '='
}
期待完全是一个对象。
问题的原因是AngularJS会在每次更改时刷新页面的各个部分。因此,即使该方法返回一个对象,它也会运行几乎无限次。
我建议您将对象变量绑定到该属性。例如,在控制器中创建一个变量,通过您的方法初始化它:
vm.myValue = vm.buildValue();
然后,将此参数传递给您的指令:
<my-directive passed-value="ctrl.myValue"></my-directive>