標籤:生命週期 標記 out async 空白 apply log 天空 機制
很久沒有寫點東西了,從今天起,在部落格園對自己過往的工作,學習和生活做一些梳理,總結和溫故。今天窗外的陽光不那麼任性,天空白雲點點,蟬鳴依舊嘹亮,安靜地坐在陽台上,吹著風,敲擊著鍵盤。於我而言,這就是幸福生活。
轉入正題,對angularjs髒檢查機製做了個回顧和總結如下:
參考文章:
http://teropa.info/build-your-own-angular/
http://www.cnblogs.com/likeFlyingFish/p/6183630.html
http://www.ituring.com.cn/article/39865
1、Angular並不是周期性觸發髒檢查,更不是長串連輪詢檢查。
2、一般一個事件迴圈中執行到任務隊列時,如UI事件,ajax請求或者 timeout 延遲事件等觸發髒檢查。
3、Angular 每一個綁定到UI的資料,就會有一個 $watch 對象。
4、所有的watch儲存在$$watchList中,一次髒檢查就是調用一次 $apply() 或者 $digest(),遍曆檢查所有watch,將資料中最新的值呈現在介面上。
5、$digest現在至少運行每個監聽器一次了。如果第一次運行完,有監控值發生變更了,標記為dirty,所有監聽器再運行第二次。這會一直運行,直到所有監控的值都不再變化,整個局面穩定下來了。
6、關於$apply,大的想法是,我們可以執行一些與Angular無關的代碼,這些代碼也還是可以改變範圍上的東西,$apply可以保證範圍上的監聽器可以檢測這些變更。當人們談論使用$apply整合代碼到“Angular生命週期”的時候,他們指的就是這個事情,也沒什麼比這更重要的了。
7、但在Angular中還有一種延遲代碼的方式,那就是Scope上的$evalAsync函數。$evalAsync接受一個函數,把它列入計劃,在當前正持續的digest中或者下一次digest之前執行。舉例來說,你可以在一個監聽器的監聽函數中順延強制一些代碼,即使它已經被延遲了,仍然會在現有的digest遍曆中被執行。
angularjs髒檢查機制