[解決済み] ExpressionChangedAfterItHasBeenCheckedErrorの説明
質問
なぜこのようなエラーが発生し続けるのか、説明してください。
ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked.
明らかに、私は開発モードでのみこの問題が発生し、本番ビルドでは発生しません。しかし、これは非常に迷惑で、開発環境でエラーが発生し、本番では表示されないことの利点が単に理解できません - おそらく私の理解不足のためでしょう。
通常、修正はとても簡単で、エラーの原因となるコードをこのようにsetTimeoutで囲むだけです。
setTimeout(()=> {
this.isLoading = true;
}, 0);
あるいは、次のようなコンストラクタで強制的に変更を検出します。
constructor(private cd: ChangeDetectorRef) {}
:
this.isLoading = true;
this.cd.detectChanges();
しかし、なぜいつもこのエラーに遭遇するのでしょうか?それを理解して、今後このようなハッキング的な修正を避けることができるようにしたいです。
解決方法は?
を理解すると、多くのことがわかるようになりました。 Angular ライフサイクルフック と変更検知との関係です。
にバインドされたグローバルフラグを更新するように、Angularに指示しようとしていました。
*ngIf
の中でそのフラグを変更しようとしていました。
ngOnInit()
ライフサイクルフック
ドキュメントによると、このメソッドはAngularがすでに変更を検出した後に呼び出されます。
最初の ngOnChanges() の後に一度だけ呼び出されます。
の中のフラグを更新することです。
ngOnChanges()
は変更検出を開始しません。そして、再び変更検出が自然に発動されると、フラグの値が変更され、エラーがスローされます。
私の場合、これを変更しました。
constructor(private globalEventsService: GlobalEventsService) {
}
ngOnInit() {
this.globalEventsService.showCheckoutHeader = true;
}
これに
constructor(private globalEventsService: GlobalEventsService) {
this.globalEventsService.showCheckoutHeader = true;
}
ngOnInit() {
}
で、問題が解決しました :)
関連
-
Angularが報告するインジェクションエラーとその解決方法...$injector:unpr]。
-
[解決済み] Angularの@Directiveと@Componentの比較
-
[解決済み] ExpressionChangedAfterItHasBeenCheckedErrorの説明
-
[解決済み] Angular 2の "select "で新しい選択範囲を取得するにはどうすればよいですか?
-
[解決済み] Angular CLI SASSオプション
-
[解決済み】エラー NG6002: AppModule の NgModule.imports に表示されるが、NgModule クラスに解決できなかった。
-
[解決済み] AngularのINPUT要素でngModel内のパイプを使用する
-
[解決済み] Angular Materialダイアログエリアの外をクリックしてダイアログを閉じないようにする(Angularバージョン4.0以上で使用可能)
-
[解決済み] イベントリスナーを動的に追加する
-
[解決済み] angular-cli server - デフォルトのポートを指定する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular 2 下へスクロールする(チャット形式)
-
[解決済み] 予算内の警告、初期値で最大値を超える
-
[解決済み] 例外が発生しました。既知のネイティブプロパティではないため、'ngFor'にバインドできない
-
[解決済み】Angularでファイルアップロード?
-
[解決済み] AngularプロジェクトでBootstrapを使うには?
-
[解決済み] ナンバーパイプ - Angular 2のパラメータは?
-
[解決済み] index.tsは何に使われているのですか?
-
[解決済み] AngularでngFor repeatをある数のアイテムに制限するにはどうすればよいですか?
-
[解決済み] Angularチュートリアルのpipeメソッドとtapメソッドとは何ですか?
-
[解決済み] ページを離れる前に、未保存の変更点を警告する