変化検出とは何ですか?次の記事では、Angular の変更検出メカニズムを理解し、変更検出がどのように機能するかについて説明し、Angular 変更検出のパフォーマンス最適化方法を紹介します。
angular チュートリアル"]
NgZone とそのフォーク オブジェクト
Zone.js について説明します。
Zone.js は、ブラウザーでの非同期アクティビティをカプセル化してインターセプトするために使用され、
非同期ライフサイクル フック と 統合された非同期エラー処理メカニズムも提供します。
Zone.js は、
Monkey Patching を使用して、ブラウザ内の一般的なメソッドと要素 (setTimeout や
など) をインターセプトします。 HTMLElement.prototype.onclick。 Angular は、起動時に
Zone.js を利用して、いくつかの低レベルのブラウザ API にパッチを適用して、非同期イベントをキャプチャし、キャプチャ時間後に変更検出を呼び出します。
Zone.js をフォークし、独自のゾーン
NgZone を展開して、アプリケーション内のすべての非同期操作がこのゾーンで実行されるようにします。
changeDetector を生成し、コンポーネントの変更ステータスを記録します。
ApplicationRef のインスタンスも作成します。このインスタンスは、現在作成中の Angular アプリケーションのインスタンスを表します。
ApplicationRef 作成されると、ngZone の
onMicrotaskEmpty イベントにサブスクライブされ、すべてのマイクロタスクが完了した後、すべてのビューの detectChanges() が呼び出されて実行されます。変化検出です。
ケース 1 開発モードでは、Angular は 二次検出を実行します (本番環境で enableProdMode()## を呼び出します #、検出数は 1 に減ります)。 ステップ 4
が完了した後、子孫コンポーネントで親コンポーネントのプロパティを変更すると、Angular が 2 回目の検出を実行して 2 つの値が矛盾していることが判明すると、上記のエラーが発生します。
ケース 2 親コンポーネントがプロパティを子コンポーネントにバインドしている限り、OnChanges、OnInit、DoCheck、AfterContentInit、AfterViewInit の実行に関係なく、サイクルフック内の次のコードもエラーを報告します。 // #parent
{{data}}
<child [data]="data"></child>
// in child component ts, execute:
this.parent.data = 'new Value';
##デフォルト戦略# このデフォルトの戦略は、イベント (ユーザー イベント、タイマー、XHR、Promise など) が変更検出をトリガーするたびに、コンポーネント ツリー内のすべてのコンポーネントを上から下までチェックします。コンポーネントの依存関係について何の仮定も行わないこの保守的なチェック方法は、Dirty Check と呼ばれます。この戦略は、適用するコンポーネントが多すぎると、アプリケーションのパフォーマンスに影響を与えます。
changeDetection、OnPush 戦略に設定した後、Angular は変更検出をトリガーするたびに、このコンポーネントとこのコンポーネントのすべてのサブコンポーネントの変更検出をスキップします。
OnPush 戦略では、次の状況のみがコンポーネント変更検出をトリガーします:
この時点で、不必要なテストの分析と削減を開始する必要があります。
検査数を減らす方法
一般的に、私たちは生きています。チャート クラス ライブラリの初期化などのサイクル フックでサードパーティ ライブラリを使用する場合、requestAnimationRequest/setTimeout/addEventListener が付属します。初期化メソッドを NgZone## の
runOutsideAngular メソッドに書き込むことができます。 #。
#OnPush 戦略
変更検出の実行戦略 セクションを参照)。
{{function(data)}}## の代わりに 純粋なパイプ
を使用してください{{function(data)}} という記述方法では、変更検出が発生するたびにすべての値が再計算されます。 (?: 1,000 項目のリストがある場合、データは 1 つだけ変更されますが、更新する必要のない他の 999 個のデータも再計算されます。)このとき、パイプメソッドを使用できます。変更された値のみが操作をトリガーし、ビューの一部を更新します。
上記の 4 点の解決策は、
// environment.dev.ts ... production: false ...
"optimization": false
projects > your-project-name > architect > build > configurations > dev > "optimization": false
更多编程相关知识,请访问:编程教学!!
以上がAngular の変更検出メカニズムとパフォーマンスを最適化する方法の簡単な分析?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。