2017-03-21 40 views
0

我正在使用angular-meteor並希望在每個對象上執行一個函數。我試圖在視圖中的ng-repeat內運行這個函數,但是我得到了大量的函數調用,並且無法弄清楚原因。我試圖儘可能簡單地說明發生了什麼。ng-repeat迭代過多

constructor($scope, $reactive) { 
    'ngInject'; 
    $reactive(this).attach($scope); 
    this.loaderCount = 0; 

    this.helpers({ 
     loaders() { 
      return Loaders.find({isloader:true}, {sort: { name : 1 } }) 
     } 
    }); 

這給了我26臺裝載機。我的函數只是加1計數每次函數調用時:

displayLoaderCount() 
{ 
    return ++this.loaderCount; 
} 

現在,在我看來,我循環通過每個加載器和調用函數。這應該在我的腦海裏給我26,而是我得到3836

<tr ng-repeat="loader in loaderExhaustion.loaders"> 
     <td>{{loaderExhaustion.displayLoaderCount()}}</td> 

誰能幫我解釋一下?理想情況下,我想循環模塊中的內容,但由於集合是異步的,因此當循環開始時,集合的長度爲0,因此我在視圖中進行了調用。

謝謝!

回答

1

每次角度進入一個變化檢測週期,它評估loaderExhaustion.displayLoaderCount(),知道這個表達式的結果是否已經改變,並且如果它已經更新了DOM。這個功能改變了控制器的狀態(因爲它增加了this.loaderCount),因此它觸發了一個額外的變化檢測循環,它重新評估表達式,這改變了控制器的狀態等等等。

你可以不改變狀態在一個表達式中,對於一個給定的狀態,角度應該能夠調用這個函數兩次,並且得到相同的結果兩次,像這樣的表達式不能有副作用

我不明白你想要什麼通過這樣實現的,所以很難告訴你應該怎麼做,而不是。

+1

謝謝你,這是有道理的。基本上,我試圖做的是基於什麼是有些心計在每個對象中。例如,假設每個對象都有一個數字,那麼每個對象會遍歷所有數字?如果我在構造函數中這樣做,集合仍然是0,並且循環立即結束。我需要一種方法在所有裝載器(26)返回後調用它。對不起,這對我來說很困惑。 – enfrost

+0

我不知道裝載機是什麼。如果它加載一些東西異步函數,你把它的26倍,我想它會返回一個承諾(或採取一個回調函數)上,您可以撥打'。然後(()=> this.loaderCount ++)' –