2016-09-26 38 views
0

我有一个指令到我传递是动态生成的对象:深手表属性传递给一个指令

<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'} 
}; 

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

那么我怎么能要求角度考虑对象没有改变,如果它的属性是相同的,即使对象是新的?

这应该是可能的,因为我知道当我深入观察一个物体时(使用$watch(..., true)),角度认为如果物体的属性相同,即使物体始终是新物体,它也是相同的。

+0

的'$ watch'作为和可选参数'objectEquality '你可以设置为'true',它使用'angular.equals'而不是引用,[$ rootScope.Scope](https://docs.angularjs.org/api/ng/type/$rootScope.Scope)。这可能会帮助你 – taguenizy

回答

0

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

scope: { 
    passedValue: '=' 
} 

正在期待一个对象。

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

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

vm.myValue = vm.buildValue(); 

然后,这个参数传递给你的指令:

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