2017-08-09 214 views
0

我正在實施以下* ngIf。我知道我不應該在技術上從*中調用一個函數ngIf,但它需要一個黑客:ExpressionChangedAfterItHasBeenCheckedError解決方法

<div *ngIf="!ddlAuthorsSelect2Bound && wireUpSelect2()"></div> 

不管怎樣,下面的實現正常工作:

<div *ngIf="wireUpSelect2()"></div> 

然而,由於某些原因這個* ngIf被多次調用。所以我在第一個代碼示例中添加了額外的成員變量檢查來防止附加的函數調用。這工作像預期的那樣好,但NG2寫入以下錯誤控制檯:

Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'true'. Current value: 'false'. 

你知道的,我可以抑制這種錯誤的方法嗎?

+0

我不知道如果我明白,ddlAuthorsSelect2Bound是一個'開關'來檢測wireUpSelect2()何時被調用或者當ngIf有效時? – Vega

+0

嗨維加 - 對不起,我不清楚這一點。 ddlAuthorsSelect2Bound具有默認值false,但在wireUpSelect2()被調用後被設置爲true。由於* ngIf表達式被多次實現,wireUpSelect2()有一個guard子句,如果ddlAuthorsSelect2Bound設置爲true,則跳過連接邏輯。 – user8334943

+0

wireUpSelect2()中檢查ddlAuthorsSelect2Bound值的方法如何?就像(ddlAuthorsSelect2Bound)返回一樣。一種'半解決方法'。 – Vega

回答

0

快速和骯髒的解決方法是把它放在你的組件:public ngDoCheck(): void { this.cdRef.detectChanges(); }

確保導入:import {... , ChangeDetectorRef} from '@angular/core';

,包括它在構造函數中:constructor(..., private cdRef:ChangeDetectorRef) {...}

Thiscommon問題@angular 4.2.x.不管這是否是最佳實踐,解決方法將比添加一個生命週期檢查更加繁瑣。如果我沒有弄錯,你不應該爲4.3.x做這個。

0

首先避免使用功能* ngIf wireUpSelect2()

原因你犯錯Expression has changed after it was checked. Previous value: 'true'. Current value: 'false'.是模板解析發生的順序。如果布爾型!ddlAuthorsSelect2Bound在html中的後續行中發生更改,並且您在html頂部調用此布爾值,則會出現此錯誤。

+0

謝謝我知道原因,但要求一個解決方法 – user8334943

+0

嗨,如果你可以共享的HTML和TS文件我CAD找到一些解決方法。一般意義上的解決方法是使用不同的布爾變量,並藉助其他布爾變量以後續順序進行更改,從而更改一個布爾變量的值。 –