錯誤百科

運算式的值在檢查後發生變更

當運算式的值在變更偵測完成後又被變更時,Angular 會拋出 ExpressionChangedAfterItHasBeenCheckedError。Angular 只會在開發模式下拋出這個錯誤。

在開發模式下,Angular 會在每次變更偵測執行後額外進行一次檢查,確保繫結沒有改變。這能抓出檢視被留在不一致狀態的錯誤。例如,方法或 getter 每次被呼叫時都回傳不同的值,或子元件變更了父元件的值,都可能造成這種情況。只要發生上述任一情形,就表示變更偵測尚未穩定。Angular 拋出這個錯誤,是為了確保資料永遠能正確反映在檢視上,避免 UI 行為異常,甚至陷入無限迴圈。

這個錯誤常出現在你新增了範本運算式,或開始實作 ngAfterViewInit 或 ngOnChanges 等生命週期鉤子時;處理載入狀態與非同步操作,或子元件變更其父元件的繫結時,也很常見。

如何除錯

CLI 產生的 source map 在除錯時非常有用。沿著呼叫堆疊往上找,直到找到錯誤訊息中顯示的值已變更的那個範本運算式。

確保變更偵測執行之後,範本中的繫結不會再被變更。這通常表示要重構程式碼,改用適合你使用情境的元件生命週期鉤子。如果問題出在 ngAfterViewInit,建議的解法是在建構函式或 ngOnInit 中設定初始值,或使用 ngAfterContentInit 處理其他值的繫結。

如果你在檢視中繫結到方法,請確保呼叫該方法時,不會更新範本中的任何其他繫結。

想了解哪種解法適合你,請參閱 'Everything you need to know about the "ExpressionChangedAfterItHasBeenCheckedError" error';想了解這個錯誤為什麼有用,請參閱 'Angular Debugging "Expression has changed after it was checked": Simple Explanation (and Fix)'。