2014-02-19 31 views
0

jsFiddle:http://jsfiddle.net/ADukg/4766/

我已經寫了一些實際上正常工作的基本角碼,並且我得到了想要的結果和輸出。但是,我的控制檯中出現了一些錯誤,它們不斷循環,最終導致瀏覽器崩潰。我在這裏讀過一些類似的問題,但似乎無法得到解決方案來處理我的代碼。

任何人都可以弄清楚什麼是錯誤的以及如何解決?

Error: 10 $digest() iterations reached. Aborting! 

回答

3

從你的函數,你必須返回一個穩定的對象(或接近穩定)。因爲getBreakdown函數中有新的對象,所以angular會認爲它們是新的,並用新的hashkey將它們放入範圍中。

角然後再次運行此$digest,檢查以確保沒有任何變化......但它看到新的對象,並假定模型沒有穩定。它再次運行它......並再次獲取新對象......並再次......並再次獲取新對象。

故事的寓意是你不應該在分配給作用域的函數中創建新模型。

如果您不需要實時綁定,只需將該var變換爲一個新的$ scope變量一次,不要綁定到該函數。如果您需要實時綁定,我認爲您的解決方案是使用過濾器。

btw ...在你的函數返回之前加一個console.log(breakdown),檢查數組中的每個對象,你會看到它輸出10次,每個$$hashkey的值是不同的。 Angular使用$$hashkey來跟蹤對象。我認爲了解你如何混淆它會更容易。

我用來教人們這個概念的例子是一個返回一個隨機數的函數。如果你嘗試綁定到那個函數,angular會每次獲得一個新的隨機數並且永遠不會穩定10次。 Angular不知道它已經完成消化......曾經。所以這就是爲什麼他們將其限制爲10.

+0

所以我不需要活動綁定,因爲每次我需要更新數據時我都會調用該函數。我試圖將變量轉換爲$範圍,但沒有運氣。你介意更新我的jsfiddle來展示我嗎? – user2656127

+0

當然,這是它:http://jsfiddle.net/ADukg/4767/它只是在控制器啓動時運行一次。每當它發生變化時,您都需要在控制器中調用getBreakdown。 –

+0

完美的喬納森,非常感謝! – user2656127

相關問題