[解決済み】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の変更に気づき、画面を更新する。
その他の参考文献をご紹介します。
- Angularの$digestは新しいバージョンで生まれ変わった - AngularJSのアイデアがAngularにどのようにマッピングされるかを説明します。
- Angularの変更検出について知っておくべきすべてのこと - は、変更検出がどのように機能するかについて、非常に詳細に説明しています。
- 変更検出の説明 - Thoughtramブログ 2016年2月22日 - おそらく最高のリファレンスです。
- サフキンズ 変更検出の再発明 ビデオ - ぜひご覧ください。
- Angular 2の変更検出は実際にどのように行われるのですか? - jhadeのブログ 2016年2月24日
-
ブライアンのビデオ
と
Miškoのビデオ
Zone.jsについて。 ブライアンのはZone.jsについてです。 Miškoは、Angular 2がZone.jsを使ってどのように変更検知を実装しているかについて述べています。 また、一般的な変更検出について、そして
onPush
. - ビクター・サヴキンズのブログ記事 Angular 2の変更検出 , Angular 2アプリケーションの2つのフェーズ , Angular、不変性、カプセル化 . 彼は多くの分野を素早くカバーしますが、時に簡潔で、欠けている部分について疑問に思い、頭をかきむしることになります。
- 超高速チェンジディテクション (Google doc) - 非常に技術的で、非常に簡潔ですが、ツリーの一部として構築されるChangeDetectionクラスについて説明/スケッチしています。
関連
-
angularでのng-repeatとtrack by
-
[解決済み] AngularJSとHandlebars - 両方必要なのかどうか
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] クラスを条件付きで適用する場合の最適な方法は何ですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] AngularJS テンプレートにおける if else ステートメント
-
[解決済み] Angularで@Input()の値が変更されたときに検出する方法は?
-
[解決済み] ng-repeat :単一フィールドによるフィルタリング
-
[解決済み】AngularJS 。observe メソッドと $watch メソッドの違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】npm UNMET PEER DEPENDENCYの警告を修正するにはどうすればいいですか?
-
[解決済み] 適用がすでに進行中のエラー
-
[解決済み] select 要素のデフォルト値を設定するための ng-option の使用方法
-
[解決済み] ajaxリクエスト時にAngularjsのローディング画面が表示される。
-
[解決済み] ディレクティブ '...' が要求するコントローラ 'ngModel' が見つかりません。
-
[解決済み] controllerAs "プロパティを使用する理由は何ですか?
-
angularjs統合ueditor入門
-
角型グローバル確認ボックス
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] ng-classを使った複数クラスの追加