檢測機制
,用於遍歷元件樹,檢查每個元件的變化,並在元件屬性發生變化的時候觸發DOM
的更新。【相關教學推薦:《》】狀態
並使之在使用者介面可見
。這個狀態可以是任何的物件、陣列、基本資料型別。事件驅動,來源有以下三大類:
這幾點有一個共同點,就是它們都是非同步的,也就是說,所有的非同步操作
是可能導致資料變化的根源因素,所以每當執行一些非同步操作時,我們的應用程式狀態可能發生改變,而這時則需要去更新檢視
在Angular
當中則接入了NgZone
,由它來監聽Angular所有的非同步事件
,Angular 在啟動時會重寫(通過 Zone.js
)部分底層瀏覽器 API(暴力的攔截了所有的非同步事件)。
常見的有兩種方式來觸發變化檢測,一種方法是基於元件的生命週期勾點
ngAfterViewChecked() { console.log('cluster-master.component cd'); }
另一種方法是手動控制變化檢測的開啟或者關閉,並手動觸發
constructor(private cd: ChangeDetectorRef) { cd.detach() setInterval(() => { this.cd.detectChanges() }, 5000) }
Angular 的核心是元件化,元件的巢狀會使得最終形成一棵元件樹
,Angular 的變化檢測可以分元件進行,每個元件都有對應的變化檢測器 ChangeDetector
,可想而知這些變化檢測器也會構成一棵樹。
在 Angular 中每個元件都有自己的變化檢測器,這使得我們可以對每個元件分別控制如何以及何時進行變更檢測。
Angular還讓開發者擁有客製化變化檢測策略的能力。
每次
變更檢測都會引起元件的變更檢測,包括其他元件
的狀態變化,以及本元件
參照型變數內部屬性值變化滿足一些條件
4.1 default
Angular 預設的變化檢測機制是 ChangeDetectionStrategy.Default
,每次非同步事件 callback 結束後,NgZone會觸發整個元件樹
至上而下
做變化檢測
4.2 onPush
OnPush 策略,用以跳過
某個 component 以及它下面所有子元件
的變化檢測
其實在設定了 OnPush
策略以後,還是有許多方法可以觸發變更檢測的;
@Input
屬性的參照
發生變化。DOM
事件,包括它子元件的 DOM 事件,比如 click、submit、mouse down
。Observable
訂閱事件,同時設定 Async pipe
。ChangeDetectorRef.detectChanges()、ChangeDetectorRef.markForCheck()、ApplicationRef.tick()
方法子元件
,將該子元件到根元件
之間的路徑標記起來,通知 angular 檢測器下次變化檢測時一定
檢查此路徑上的元件,即使設定了變化檢測策略為 onPush
該元件到各個子元件
的變更檢測脫離
,不再受檢測機制的控制,除非重新 attach 上重新連結
到檢測器樹上更多程式設計相關知識,請存取:!!
以上就是什麼是變更檢測?聊聊angular的變更機制的詳細內容,更多請關注TW511.COM其它相關文章!