[英]Angular Material Change Detection using ngOnChanges throwing error, “ExpressionChangedAfterItHasBeenCheckedError”
[英]Angular ngOnChanges and the change detection strategies appear to be contradictory?
NgChanges on 在輸入綁定上運行 - 如果輸入是引用類型 - 當引用更改時。 即這樣的對象:
{ 值:2 }
如果更改其 value 屬性,則不會導致 ngchanges 運行。 這是因為 Angular 默認更改檢測策略會比較引用。
Angular2 更改檢測:ngOnChanges 不會為嵌套對象觸發
然而,當我們考慮兩種變化檢測策略時,這對我來說似乎是矛盾的:
默認 - 組件的更改檢測在綁定更改時發生 - 但根據上述內容,這不會識別引用類型的引用未更改的輸入的更改。 或者換句話說,更改檢測僅在值類型值更改或引用類型引用更改時運行。
OnPush - 更改檢測僅在值類型值更改或引用更改時運行。
顯然,默認更改檢測不像我理解的那樣工作,或者它與 OnPush 相同,但 onChanges 生命周期鈎子似乎只在與 OnPush 相同的規則下觸發。
Angular 將始終比較先前和新輸入值的引用。 Default 和 OnPush 策略之間的區別在於 Angular何時觸發更改檢測。
使用Default
策略 Angular 會進行臟檢查,這意味着它每次都會檢查您的應用程序中是否發生了某些變化:它將檢查每個瀏覽器事件、任何 HTTP 調用、計時器......在大型應用程序中,這種方法有一個對性能影響很大。
通過OnPush
更改檢測,Angular 只會在其輸入之一發生更改時檢查組件(它依賴於不變性的概念來了解組件何時更改)。
如果您想更深入地了解 Angular Change Detection,我建議您閱讀 Max Koretskyi 撰寫的這篇文章,他詳細解釋了 Change Detection 的工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.