彼女はあなたが2つの解決策をとります!
1. ChangeDetectionStrategyをOnPushに変更します
このソリューションでは、基本的に角度を指定します。
変更の確認を停止します。必要なときだけやります
クイックフィックス:
コンポーネントを変更して使用します ChangeDetectionStrategy.OnPush
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent implements OnInit {
// ...
}
これで、物事はもう機能していないようです。これは、今後、AngularをdetectChanges()
手動で呼び出す必要があるためです。
this.cdr.detectChanges();
ChangeDetectionStrategyの権利を理解するのに役立つリンクを次に示します。https:
//alligator.io/angular/change-detection-strategy/
2. ExpressionChangedAfterItHasBeenCheckedErrorを理解する
このエラーの原因についてのtomonari_t 回答からの小さな抜粋を以下に示します。これを理解するのに役立つ部分のみを含めようとしました。
記事全体は、ここに示されているすべてのポイントに関する実際のコード例を示しています。
根本的な原因は、角度のあるライフサイクルです。
各操作の後、Angularは操作の実行に使用した値を記憶しています。これらは、コンポーネントビューのoldValuesプロパティに格納されます。
すべてのコンポーネントのチェックが完了した後、Angularは次のダイジェストサイクルを開始しますが、操作を実行する代わりに、現在の値を前のダイジェストサイクルで記憶した値と比較します。
次の操作は、ダイジェストサイクルでチェックされています。
子コンポーネントに渡される値が、これらのコンポーネントのプロパティを更新するために現在使用される値と同じであることを確認してください。
DOM要素の更新に使用される値が、これらの要素の更新に使用される値と同じであることを確認します。
すべての子コンポーネントをチェックします
したがって、比較された値が異なる場合、エラーがスローされます。、ブロガーのMax Koretskyiは次のように述べています。
原因は常に子コンポーネントまたはディレクティブです。
そして最後に、通常はこのエラーを引き起こす実際のサンプルをいくつか示します。
- 共有サービス
- 同期イベント放送
- 動的コンポーネントのインスタンス化
すべてのサンプルはここにあります(plunkr)。私の場合、問題は動的コンポーネントのインスタンス化でした。
また、私自身の経験から、私は誰もがsetTimeout
ソリューションを回避することを強くお勧めします。私の場合、「ほぼ」無限ループが発生しました(挑発する方法を示すつもりのない21の呼び出し)。
Angularのライフサイクルを常に念頭に置いて、別のコンポーネントの値を変更するたびにどのように影響を受けるかを考慮することをお勧めします。このエラーにより、Angularは次のように伝えています。
あなたはおそらくこれを間違った方法で行っています、あなたは正しいですか?
同じブログはまた言います:
多くの場合、修正は、正しい変更検出フックを使用して動的コンポーネントを作成することです
私のための短いガイドは、コーディング中に少なくとも次の2つのことを考慮することです(私は時間をかけてそれを補完するように努めます):
- 代わりに、子のコンポーネントから親コンポーネントの値を変更しないでください。親から変更してください。
- あなたが使用する場合
@Input
と@Output
ディレクティブは、コンポーネントが完全に初期化されない限り、lyfecycleの変更をトリガしないようにしてください。
this.cdr.detectChanges();
それらの不要な呼び出しは、特に多くの動的データを処理しているときに、より多くのエラーをトリガーする可能性があるため、避けてください
- の使用
this.cdr.detectChanges();
が必須の場合は、使用@Input, @Output, etc
されている変数()が正しい検出フック(OnInit, OnChanges, AfterView, etc
)で入力/初期化されていることを確認してください
- 可能であれば、非表示ではなく削除します。これは、ポイント3および4に関連しています。
また
Angular Life Hookを完全に理解したい場合は、こちらの公式ドキュメントを読むことをお勧めします: