変化検出とは何ですか?次の記事では、Angular の変更検出メカニズムについて説明し、ステータス変更が変更検出を通知する仕組みと、Angular の変更検出戦略について説明します。
概要: コンポーネント ツリーを横断し、各コンポーネントの変更をチェックし、コンポーネントのプロパティが変更されたときにDOM
更新をトリガーする変更检测机制
。 【おすすめ関連チュートリアル:「angularチュートリアル」】
変更検出の基本タスク: プログラムの内部状态
を取得し、可见
します。この状態は、任意のオブジェクト、配列、または基本データ型にすることができます。
イベント駆動型ソースは、次の 3 つのカテゴリに分類されます。
イベント: ページのクリック、送信、マウス ダウン...
XHR: バックエンドサーバーからデータを取得します
タイマー: setTimeout()、setInterval()
これらの点には 1 つの共通点があります。それは、すべて非同期であるということです。つまり、すべての异步操作
データ変更を引き起こす可能性のある根本要因であるため、非同期操作が実行されるたびに、アプリケーションの状態が変化する可能性があります。現時点では、ビューを更新する必要があります
Angular
Angular のすべての异步事件
監視するNgZone
が接続されており、Angular は起動時に基盤となるブラウザー API の一部を ( Zone.js
を通じて) 書き換えます (すべての非同期イベントを強力にインターセプトします)。
変更検出をトリガーするには 2 つの一般的な方法があります。1 つはコンポーネントのライフサイクル フックに基づく方法です。
ngAfterViewChecked() { console.log('cluster-master.component cd'); }
もう 1 つの方法は、変更検出のオンまたはオフを手動で制御し、手動でトリガーすることです。
コンストラクター(プライベート cd: ChangeDetectorRef) { cd.detach() setInterval(() => { this.cd.detectChanges() }、5000) }
Angular の核心はコンポーネント化であり、コンポーネントの入れ子は最終的に组件树
を形成します。各コンポーネントには対応する变化检测器ChangeDetector
があり、これらの変更検出器もツリーを形成すると考えられます。
Angular では、各コンポーネントに独自の変更検出機能があり、各コンポーネントに対して変更検出をいつどのように実行するかを制御できます。
Angular を使用すると、開発者は変更検出戦略をカスタマイズすることもできます。
デフォルト:每次
変更検出により、其他组件
の状態変化や本组件
Onpush:满足一些条件
限り、各変更検出はこのコンポーネントの変更チェックをスキップします。
4.1 デフォルト
Angular のデフォルトの変更検出メカニズムはChangeDetectionStrategy.Default
です。各非同期イベント コールバックが終了すると、NgZone は整个组件树
をトリガーして至上而下
4.2 onPush
OnPush 戦略。コンポーネントとその下の所有子组件
の変更検出を跳过
ために使用されます。
実際、 OnPush
ポリシーを設定した後でも、変更検出をトリガーする方法は数多くあります。
1) コンポーネントの@Input
属性の引用
変更されます。
2) コンポーネント内のDOM
イベント ( click、submit、mouse down
などのサブコンポーネントの DOM イベントを含む)。
3) コンポーネント内のObservable
イベントをサブスクライブし、同時にAsync pipe
を設定します。
4) コンポーネントでChangeDetectorRef.detectChanges()、ChangeDetectorRef.markForCheck()、ApplicationRef.tick()
メソッドを手動で使用します。
markForCheck():该子组件到根组件
子组件
に使用され、変更検出戦略がonPush
に設定されている場合でも、次の変更検出中にこのパス上のコンポーネントをチェックする一定
角度検出器に通知します。
detectChanges():该组件到各个子组件
変更検出を手動で開始します
detach(): コンポーネントの検出器を多数の検出器から脱离
、再接続しない限り検出メカニズムによって制御されなくなります。
reattach(): 切り離された検出器を検出器ツリーに重新链接