2016-06-10 36 views
2

我已經嘗試所有三個條件刷新範圍後觸發任何事件。有時出現錯誤

$ apply或$ digest已在進行中。

最後,我使用$超時沒有任何錯誤。但我不知道根據複雜性或性能哪一個最好。

+0

性能是一個非常廣泛的話題。例如,檢查摘要是否正在運行,如果沒有,則調用它可能是最高效的(摘要和應用非常相似)。但我總是使用超時,因爲它們更容易,看起來不那麼不穩定。 – Jackie

+0

在我看來$ timout是最好的辦法 – felipekm

+0

你不應該打電話給他們中的任何人對事件做出反應。只需使用適當的ng-xxx指令即可。 –

回答

1

$timeout調用$apply它調用$digest

更詳細地:

$apply觸發根範圍$digest循環(因此在應用程序內的所有範圍)。

$digest可以直接在特定的子範圍而不是根上調用 - 但父級或兄弟範圍內的觀察者不會被觸發,因此使用$digest會導致不同範圍明顯不同步。

$timeout等待下一個消化週期,然後調用$apply(因此基本上是一個簡單的方法來調用$apply,而不必擔心「已經消化進步」的錯誤。)較新的$evalAsync是類似的,但適用於當前摘要如果可能的話,所以有時比$timeout略高一些。 (也有$applyAsync這是據我可以基本上告訴$timeout延遲10ms,因爲我敢肯定對某人有意義的原因。)

TL; DR:讓Angular管理自己的數據生命週期爲儘可能多。當你需要的時候,使用$evalAsync(或者,老實說,$timeout已經足夠接近;差別不是顯着)。

如果您開始遇到性能問題,您可以開始查找可以安全切換到在特定範圍上使用$digest的情況。 (就我個人而言,我沒有看到很多情況下,這是值得添加代碼複雜性,但也許這只是我。)

相關問題