Angular: ExpressionChangedAfterItHasBeenCheckedError
Angularの変更検知後にデータが変更された場合のエラー
概要
Angularの変更検知サイクル中にバインドされたデータが変更された場合に発生するエラーです。開発モードでのみ表示されます。
エラーメッセージ
ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked.
Previous value: 'ngIf: false'. Current value: 'ngIf: true'.
原因
- ngAfterViewInitでデータ変更: ビュー初期化後にバインドされた値を変更
- 子コンポーネントからの値変更: 親のプロパティを子が変更
- 非同期処理のタイミング: 変更検知中に非同期でデータが更新
解決策
1. setTimeout で次の変更検知サイクルに延期
| |
2. ChangeDetectorRef を使用
| |
3. ngAfterContentChecked を使用
| |
4. OnPush 変更検知戦略
| |
5. 非同期パイプを使用
| |
| |
6. BehaviorSubject を使用
| |
よくある間違い
- ngOnInitで非同期処理の結果を同期的に使用
- @ViewChildの値をngAfterViewInitで変更
- 親コンポーネントの値を@Outputで即座に変更
Angular の他のエラー
この記事は役に立ちましたか?