2015-01-05 53 views
3

我試圖讓ng-repeat在函數調用的結果,像角JS NG-重複 - 軌道通過動態收集

<body ng-init='a = [1, 2, 3]'> 
    <div ng-repeat='item in f(a) track by item[0]'>{{item}}</div> 
</body> 

其中f

function f (arr) { 
    return arr.map(function (v) { 
     return [v] 
    }) 
    } 

下面是Plunker與此代碼

問題是,在控制檯中,我們可以看到如10 $digest() iterations reached. Aborting!

這並不是因爲重建容器陣列的,因爲如果我們只是修改line 3

return [v] -> return v 

,並刪除

track by item[0] 

一切正常。這是因爲重新創建項目,並且track by應該處理這個。但由於某些原因,它不:(

我也想不買track by把不斷$$hashKey每個項目來解決問題(即使在集合本身)。這裏是Plunker具有同樣的錯誤。希望有一個可以解釋這是爲什麼不工作

因此,有兩個獨立的問題:使用的情況下,並track by用的情況下$$hashKey

BTW是的,我讀了幾次 How to Loop through items returned by a function with ng-repeat?AngularJS InfDig error (infinite loop) with ng-repeat function that returns array of objects多,但無法找到答案有

感謝

+0

我已經做了一些調查,發現https://groups.google.com/forum/#!topic/angular/IEIQok-YkpU人們討論我真正的問題,簡化了我現在的問題。他們擁有的解決方案以及我的第二個(使用'$$ hashKey'操作)工作在舊角度,並且在現代版本中不起作用。我認爲剎車已經進入了1.1.3 - > 1.1.4,就在'track by'進入Angular時 – Agat

回答

1

是否有任何理由,你不能計算結果和然後顯示呢?即有ng-init="a = [0,1,2]; fa = f(a);",然後ng-repeat="item in fa"

Working plunkr example

如果您需要更新時a變化,你可以只是有一個$scope.$watch聲明留意更改a,然後更新fa該計算結果。

+0

有很多方法可以解決這個問題。但是,起初,根據我試圖實施的事情,他們並不那麼直截了當,然後我想知道我目前的工作方式有什麼問題 – Agat

+0

好的,我想我明白了。話雖如此,我的2美分將是'ng-repeat'通常可能是角度效率非常低的根源,最好儘可能少地在'ng-repeat'指令中留下邏輯。這就是爲什麼我建議在將它們傳遞給指令之前預先計算您的值。不僅如此,手動更新您的值而不是讓角度「決定」何時更新它們也可以使事情更有效率,並且實際上,更清楚發生的事情。 – KhalilRavanna

+0

這不是關於邏輯,而是關於數據綁定:用'$ watch'解決這個問題,我們阻止Angular做他創建的東西 - 在沒有支持代碼的情況下綁定數據(在list'track by' case) – Agat

0

好吧,這裏是黑客,我們可以用它來解決的情況下沒有track by$$hashKey

ng-repeat="item in t = angular.equals(t, f(a)) ? t : f(a)" 

但這並回答爲什麼有問題的例子是不工作的問題。所以,請,如果你知道答案 - 發佈 - 我會非常感謝