5

$scope.$apply()Angular アプリで websocket を介してデータを受信したときにモデルのバインディングを更新するために使用しており、それが機能します。しかし、それは実際に何をし、なぜ更新を達成するために呼び出す必要があるのでしょうか?

4

3 に答える 3

5

提供されたコードを呼び出すと、 Angular が提供するものを利用できる$applyコードが実行されます。angular-context

リンクから:

Angular は、独自のイベント処理ループを提供することで、通常の JavaScript フローを変更します。これにより、JavaScript が従来の実行コンテキストと Angular 実行コンテキストに分割されます。Angular 実行コンテキストで適用される操作のみが、Angular データ バインディング、例外処理、プロパティ ウォッ​​チングなどの恩恵を受けます...

ここに画像の説明を入力

$apply() を使用して、JavaScript から Angular 実行コンテキストに入ることができます。ほとんどの場所 (コントローラー、サービス) では、イベントを処理しているディレクティブによって $apply が既に呼び出されていることに注意してください。$apply への明示的な呼び出しは、カスタム イベント コールバックを実装する場合、またはサードパーティ ライブラリのコールバックを使用する場合にのみ必要です。

于 2013-09-10T04:07:34.310 に答える
1

簡単に言えば:

  1. (オプション) 引数として渡された式を処理します。
  2. $rootScope で $digest() を呼び出します。

また、$apply、$digest、$watch の機能と、それらがどのように連携するかについてのブログ エントリも書きました。

それが役立つことを願っています。

于 2013-09-10T04:00:21.007 に答える
1

Angular ドキュメントから:

$apply() は、angular フレームワークの外部から angular で式を実行するために使用されます。(たとえば、ブラウザー DOM イベント、setTimeout、XHR、またはサード パーティ ライブラリから)。angularフレームワークを呼び出しているため、例外処理の適切なスコープライフサイクルを実行し、ウォッチを実行する必要があります。

ドキュメントには、その疑似コードも記載されています。

function $apply(expr) {
  try {
    return $eval(expr);
  } catch (e) {
    $exceptionHandler(e);
  } finally {
    $root.$digest();
  }
}

つまり、$apply式を評価してダイジェスト サイクルをトリガーし、Angular に登録済みのすべてのウォッチ リスナーを実行させ、ビュー バインディングを更新させます。

最後に、モデルのバインディングを更新するために を使用していると言いましたが$apply、これは、更新が Angular の外部から行われた場合にのみ必要です。ほとんどの場合、手動で呼び出す必要はありません。

于 2013-09-10T04:12:59.790 に答える