1.angularJS1
在angularJS1中臟檢查循環(huán)主要發(fā)生在:
- 調(diào)用angular封裝的DOM事件(click)
- 調(diào)用http服務(wù)($http)
- 調(diào)用定時器($timeout,$interval)
- 手動調(diào)用$scope.$apply或$scope.digest
實現(xiàn)的過程則是,遍歷監(jiān)視器隊列中的每一個監(jiān)控元素荆责,如果監(jiān)控元素發(fā)生了變化,則調(diào)用其注冊的監(jiān)聽函數(shù)盗扇,在監(jiān)聽函數(shù)中會改變相應(yīng)視圖元素。
2.angularJS2
(1)變化監(jiān)測的時機
- 用戶行為操作沉填,即DOM事件
- 前后端的數(shù)據(jù)交互粱玲,使用XHQ對象
- 各類的定時任務(wù)
它們都是異步的處理,使用異步回調(diào)函數(shù)來處理相關(guān)的數(shù)據(jù)操作拜轨。
(2)變動通知機制
angularJS2引入了NgZone服務(wù),這個服務(wù)獲取到了整個應(yīng)用的上下文允青,能夠?qū)ο嚓P(guān)異步事件發(fā)生橄碾、完成、或異常等進行捕獲颠锉。
當有異步事件觸發(fā)導(dǎo)致數(shù)據(jù)變化時法牲,這些異步事件會被NgZone捕獲并觸發(fā)onUnstable自定義事件,在該自定義事件處理函數(shù)中通知angular去執(zhí)行變化監(jiān)測矩屁,如當鼠標經(jīng)過的mousemove事件發(fā)生時马胧,它將觸發(fā)變化監(jiān)測纺阔。
(3)變化監(jiān)測的響應(yīng)處理
觸發(fā)變化監(jiān)測后,從根組件開始悼瓮,依次觸發(fā)各個子組件的內(nèi)部的變化監(jiān)測器去完成變化對比工作。因此任何一個組件中的數(shù)據(jù)變化都會導(dǎo)致整個組件樹的變化監(jiān)測艰猬。
(4)手動進行變化監(jiān)測
通過調(diào)用該組件的變化監(jiān)測器(ChangeDetectorRef)的接口横堡,可以從變化監(jiān)測樹中分離變化監(jiān)測器(detach()),并手動執(zhí)行變化監(jiān)測(detectChanges())
(5)變換監(jiān)測策略
- Default 變化監(jiān)測檢查其內(nèi)部所有數(shù)據(jù)
- OnPush 變化監(jiān)測只檢查輸入屬性(Input)的值冠桃,對于對象僅做引用對比命贴,而不做值對比
如果子組件的輸入屬性為對象,則可以通過使用Immutable對象來傳值