2013-07-02 75 views
3

我做了NG-重複了由控制器聲明的函數返回一個列表,我得到「10 $摘要()迭代達到「達到10 $摘要()迭代」。中止!」信息。初始化變量一次,以防止

<div ng-repeat element in list()></div> 

功能:

MyCtrl = ($scope)-> 
    ... 
    $scope.list = -> 
     list = {} 
     for e in someArray 
      .... #adding stuff to list 
     list 
    ... 

我發現這個問題是$scope.list()函數被調用多次,並且每個功能被稱爲本地list變量被重新分配,這樣的角度時看到不同的每次對象,並重新繪製ngRepeat元素。我怎樣才能避免這種情況?

回答

6

角表達式進行求值每至少兩次每$消化和$消化可以一次運行10次(當綁定需要被「刷新」)。這意味着表達式將被多次重新評估。 這是棱角分明常見的問題之一。所以你需要確保你不要直接在你的表達式中調用函數。相反,具備的功能執行一次,在控制器內,並且比使用函數的結果表達式:直接

function MyCtrl($scope){ 

    function makeList(){ 
    var list = []; 
    // do some logic to generate a list 
    return list; 
    }; 

    $scope.list = makeList(); 
} 
<div ng-repeat="element in list"></div> 

如果你調用範圍方法比確保方法冪等。

+0

謝謝,我看到的問題。 – olanod

0

之前我沒有想到這一點,但我解決它宣佈list之外的功能,現在在函數返回的元素總是保持相同的參考。

MyCtrl = ($scope)-> 
    ... 
    list = {} 
    $scope.list = -> 
     for e in someArray 
      .... #adding stuff to list 
     list 
    ... 

我還是不喜歡我的解決方案,我不知道是否有另一種方式...
我也想知道如果該函數可以被稱爲只是一次或幾次。在調試的時候,我看到函數被調用很多次,就像在範圍上發生了什麼變化一樣。如果someArray大,或者如果在函數內部處理速度緩慢這個重複調用似乎是一個開銷。