vb.net变量值变化触发事件_Angular变化检测的理解
獲取臟檢查的時機
Angular 使用NgZone獲取變化的通知,然后進行全面的變化檢測,進而更新Dom
臟檢查的過程
Angular的數據流是自頂而下,從父組件到子組件單項流動,單項數據流保證了高效可預測的變化檢測。盡管檢查了父組件之后,子組件可能會改變父組件的數據使得父組件需要再次被檢查,這是不被推薦的數據處理方式。在開發模式下Angular會進行二次檢查,如果出現上述情況,二次檢查就會報錯:Expression Changed After It Has Been Checked Error。而在生產環境中,臟檢查只會執行一次。
變化檢測策略
Default
通過NgZone代理的每個異步操作的構造函數中,對組件進行全面的臟檢查,進而更新顯示
OnPush
相比Default只需要在@Component裝飾器中加上一句
changeDetection:ChangeDetectionStrategy.OnPush組件級別的控制,這種模式下,變化檢測變的相對嚴格,不是所有異步操作都會導致組件進行變化檢測,這一定程度上保證了程序的性能,但是也給組件的編寫增加了復雜性,經常需要自己手動操作變化檢測來確保界面及時響應。
隔離當前組件及子組件
組件使用OnPush模式后, 外部執行 (setTimeout、http request、事件、Observable訂閱)想觸發我組件的變化檢測就變得困難,如果確定需要更新界面就需要手動調用變化檢測,可以使用markForCheck方法。
外部執行 只有對這個組件中的數據進行修改了,我們才期望變化檢測能夠檢測出數據的變化從而更新組件的顯示,這里的外部執行的代碼大部分情況下其實是我的組件的內部的代碼,只不過因為執行的是異步操作,而這個操作終止時Angular并不知道從哪里開始進行變化檢測,所以Angualr開始從組件樹的頂層開始向下檢查,到達當前組件時發現它屬于OnPush模式而數據輸入并沒有改變所以就不在進行變化檢測,所以需要手動調用檢查,這也保證了,在其它組件中的異步執行不會觸發到當前組件的變化檢測(因為根本不相關),從而提高性能。同步事件 會觸發當前組件以及它所在組件樹的所有祖先和后代組件的變化檢測,不在一個分支上的組件不會檢測,比如我的組件使用OnPush模式,組件模板中有一個按鈕,按鈕的事件處理修改組件的數據,這個事件可以直接觸發組件的變化檢測,無需單獨調用檢測,并且這個檢測會在當前組件的所有鏈條上傳遞即使組件是OnPush模式。
這個 同步事件 包括點擊事件、ngModel值的更新等問題
當組件使用OnPush模式時,如果我在組件的事件處理中修改一個變量,而這個變量需要通過NgModel傳遞給一個子組件,這個時候不會觸發子組件的變化檢測,也就是我傳遞一個值給NgModel不會顯示到界面,這個問題也有人給Angular提了Issue,原因應該就是如下代碼,更改ngModel值的過程被放到了一個異步處理,在執行的時候事件觸發的變化檢測已經完成,因為OnPush的原因該組件及子組件又不會重新觸發變化檢測,所以ngModel的值不會及時更新模板
private _updateValue(value: any): void {resolvedPromise.then(() => { this.control.setValue(value, {emitViewToModelChange: false}); });}手動操作變化檢測
constructor(private changeDectorRef:ChangeDetectorRef ){}- markForCheck() - 在組件的 metadata 中如果設置了 changeDetection:ChangeDetectionStrategy.OnPush 條件,那么變化檢測不會再次執行,除非手動調用該方法, 該方法的意思是在變化監測時必須檢測該組件。
- detectChanges() - 從該組件到各個子組件執行一次變化檢測
這塊的理解很大一部分是老大的指點,鳴謝 @徐海峰
總結
以上是生活随笔為你收集整理的vb.net变量值变化触发事件_Angular变化检测的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net core image怎么保存_
- 下一篇: java 使用接口便于维护程序_Java