2013-09-05 86 views
47

我正在閱讀很多關於AngularJS的文章,並且我遇到了這個神奇的$ watch函數。我明白如何使用它,但我想知道它是如何在後臺實現的。它是一個時間間隔函數嗎?或者它是否角度地稱這個手錶執行了每一個聲明?

我現在不想深入研究源代碼,如果你們其中一位已經知道答案並想分享他對這個主題的知識,我會很高興。

謝謝。

+0

這將幫助你http://stackoverflow.com/questions/9682092/databinding-in-angularjs/9693933#9693933 – Chandermani

+0

這太... http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/ – Sushrut

+0

下面是一篇關於它是如何工作的真實文章:http://teropa.info/blog/2013/11/03/make -your-own-angular-part-1-scopes-and-digest.html –

回答

72

每個摘要循環評估(有時多次)所有手錶。摘要循環是由於某些事件或調用$ apply()而輸入的。手錶不是基於定時器週期性地調用的。

https://docs.angularjs.org/guide/scope#integration-with-the-browser-event-loop

瀏覽器的事件循環等待一個事件的到來。事件的回調得到執行......一旦回調執行,瀏覽器就會離開JavaScript上下文並根據DOM更改重新呈現視圖。 Angular通過提供自己的事件處理循環來修改正常的JavaScript流程。這將JavaScript分解爲經典和Angular執行上下文...... Angular執行[some] stimulusFn(),它通常會修改應用程序狀態。 Angular進入$ digest循環。該循環由處理$ evalAsync隊列和$ watch列表的兩個較小的循環組成。 $ digest循環持續迭代,直到模型穩定,這意味着$ evalAsync隊列爲空,$ watch列表不檢測任何更改。 $ watch列表是一組表達式,自上次迭代以來可能發生了變化。如果檢測到更改,則會調用$ watch函數,該函數通常會使用新值更新DOM。

enter image description here

+0

綜合答案 –

+1

+1好答案。 – shashwat

+1

鏈接到文檔的確切鏈接:https://docs.angularjs.org/guide/scope – Vereb