1. ホーム
  2. angularjs

[解決済み】AngularJSの$watchに相当するAngularは何ですか?

2022-04-07 21:29:07

質問

AngularJSでは、スコープ変数の変化を監視するウォッチャーを指定するために $watch の関数を使用します。 $scope . Angularで(例えばコンポーネント変数の)変数の変化を監視することに相当するものは何ですか?

どのように解決するのですか?

Angular 2では、変更検知は自動で行われますが...。 $scope.$watch()$scope.$digest() R.I.P.

残念ながら、開発ガイドのChange Detectionセクションはまだ書かれていません(の下付近にプレースホルダーがあります)。 アーキテクチャの概要 ページ、セクション "The Other Stuff" にあります)。

変更検知の仕組みについて、私はこう理解しています。

  • Zone.js "monkey patches the world" -- ブラウザ内の非同期APIをすべて傍受します(Angular実行時)。 このため setTimeout() のようなものでなく、コンポーネント内に $timeout ... なぜなら setTimeout() はモンキーパッチが適用されています。
  • Angularはquot;change detectors"のツリーを構築し、維持します。 コンポーネント/ディレクティブごとに、そのような変更検出器(クラス)が1つあります。 (このオブジェクトへのアクセスは ChangeDetectorRef .) これらの変更検出器は、Angularがコンポーネントを作成するときに作成されます。 これはダーティチェックのために、すべてのバインディングの状態を記録します。これらはある意味、自動的な $watches() Angular 1が設定した {{}} テンプレートバインディングを使用します。

    Angular 1とは異なり、変更検出グラフは有向木であり、サイクルを持つことはできません(後述するように、これによってAngular 2はより高いパフォーマンスを発揮します)。
  • イベントが発生すると(Angularゾーンの中で)、私たちが書いたコード(イベントハンドラーコールバック)が実行されます。 このコードは、共有アプリケーションのモデル/状態やコンポーネントのビューの状態など、必要なデータを更新することができます。
  • その後、Zone.jsが追加したフックにより、Angularの変更検出アルゴリズムが実行されます。 デフォルトでは(すなわち onPush の変更検出ストラテジーは、ツリー内のすべてのコンポーネントを一度だけ (TTL=1) 検査します...上から順に、深さ優先で)。 (開発モードの場合は、変更検出は2回行われます (TTL=2)。 参照 ApplicationRef.tick() をご覧ください)。 これらの変更検出オブジェクトを使用して、すべてのバインディングのダーティチェックを実行します。
    • ライフサイクルフックは、変更検出の一部として呼び出されます。

      ウォッチしたいコンポーネントデータがプリミティブな入力プロパティ(String、boolean、number)である場合、実装は以下のようになります。 ngOnChanges() を使用すると、変更があったときに通知されます。

      入力プロパティが参照型 (オブジェクト、配列など) で、その参照が変更されていない場合 (たとえば、既存の配列に項目を追加した場合など) には、実装として ngDoCheck() (参照 今回のSO回答 をご覧ください)。

      コンポーネントのプロパティおよび/または子孫コンポーネントのプロパティのみを変更する必要があります(単一ツリーウォークの実装のため、すなわち、一方向のデータフロー)。 以下は プランカー というのは違反です。 ステートフルパイプはまた つまづく ここで
  • 見つかったバインディングの変更に対して、Component が更新され、次に DOM が更新されます。 これで変更の検出は終了です。
  • ブラウザはDOMの変更に気づき、画面を更新する。

その他の参考文献をご紹介します。