2016-09-26 40 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>