最近、AngularJS についてよく読んでいて、その魔法の $watch 関数に出くわしました。使い方はわかるのですが、バックグラウンドでどのように実装されているのか気になります。時間間隔機能ですか?それとも、実行されたすべてのステートメントがこのウォッチを呼び出しているのですか?
今はソース コードを掘り下げるつもりはありません。すでに答えを知っていて、この件についての知識を共有したいと思っている人がいれば幸いです。
ありがとう。
最近、AngularJS についてよく読んでいて、その魔法の $watch 関数に出くわしました。使い方はわかるのですが、バックグラウンドでどのように実装されているのか気になります。時間間隔機能ですか?それとも、実行されたすべてのステートメントがこのウォッチを呼び出しているのですか?
今はソース コードを掘り下げるつもりはありません。すでに答えを知っていて、この件についての知識を共有したいと思っている人がいれば幸いです。
ありがとう。
すべての監視は、ダイジェスト ループごとに (場合によっては複数回) 評価されます。何らかのイベントの結果として、または $apply() を呼び出すと、ダイジェスト ループに入ります。ウォッチは、タイマーに基づいて定期的に呼び出されるわけではありません。
https://docs.angularjs.org/guide/scope#integration-with-the-browser-event-loopを参照してください
ブラウザのイベント ループは、イベントが到着するのを待ちます。イベントのコールバックが実行されます... コールバックが実行されると、ブラウザーは JavaScript コンテキストを離れ、DOM の変更に基づいてビューを再レンダリングします。Angular は、独自のイベント処理ループを提供することで、通常の JavaScript フローを変更します。これにより、JavaScript が従来の実行コンテキストと Angular の実行コンテキストに分割されます... Angular は通常、アプリケーションの状態を変更する [いくつかの]刺激Fn() を実行します。Angular は $digest ループに入ります。ループは、$evalAsync キューと $watch リストを処理する 2 つの小さなループで構成されています。$digest ループは、モデルが安定するまで反復し続けます。これは、$evalAsync キューが空になり、$watch リストが変更を検出しないことを意味します。$watch リストは、最後の反復以降に変更された可能性のある一連の式です。