6

スコープに関するAngularの初心者の質問(docs here)。

  1. $evalスコープのコンテキストで式を実行します。
  2. $apply基本的には電話してからの発送$evalとなり$digestます。
  3. なぜ$evalAsyncですか? $digest_$digest

本当は と呼ぶべきだと思われますね。$evalAsync$applyAsync

私は初心者です - 何が欠けていますか?

4

2 に答える 2

3

$evalAsyncさまざまな状況を$applyAsyncターゲットにします。

$evalAsync :現在のダイジェスト サイクルの次のループ反復まで式を延期します。1 つの Angular ダイジェスト サイクルは、データがダーティでなくなるまで数回ループします。進行中のダイジェスト サイクルがない場合は、新しいダイジェスト サイクルを開始し ($applyメソッドを呼び出します)、式を評価します ($evalメソッドを呼び出します)。このメソッドは、Angular スコープ外の関数を呼び出しても、ダイジェスト サイクルが既に進行中のときにダーティ データをダイジェストしたい場合に役立ちます。この場合、 を呼び出すことはできません$apply

$applyAsync : 式を次のダイジェスト サイクルまで延期します。式が評価された後 (メソッドの呼び出し) まで、常にダイジェストの新しいサイクルを開始します$apply$httpこのメソッドは、いくつかのサービス コールバック (サービスなど) をダーティ スコープ データで Angular スコープから頻繁に実行する場合に役立ちます。ただし、コールバックごとにダイジェストを開始すると、パフォーマンスが低下する可能性があります。したがって、このメソッドは、いくつかの非同期コールバック間でダイジェスト サイクルを共有することによってプロセスを最適化し、メソッドよりも優れています$evalAsync

于 2016-04-08T06:54:28.867 に答える
2

$applyAsync は既に存在します:

$apply の呼び出しが後で発生するようにスケジュールします。実際の時間差はブラウザーによって異なりますが、通常は約 10 ミリ秒です。

これは、同じダイジェストで評価する必要がある複数の式をキューに入れるために使用できます

evalAsync はダイジェストを異なる方法で処理します。

$evalAsync はダイジェストをトリガーするため、ダイジェストが発生しないことが予想される場合には適していません。

注: この関数が $digest サイクルの外で呼び出されると、新しい $digest サイクルがスケジュールされます。

AngularJS 1.3 では暗黙的に呼び出されたときの this の動作が変更されました。

- 以前は、invokeApply が false に設定されていても、Promise の解決中に $rootScope ダイジェストが発生していました。これはもはや当てはまりません.invokeApply が false の場合、$timeout と $interval から返される promise は $evalAsync をトリガーしなくなります (これにより $digest が発生します)。

回避策には、$scope.$apply() を手動でトリガーするか、promise コールバックから $q.defer().promise を返し、必要に応じて解決または拒否することが含まれます。

参考文献

于 2014-12-22T07:42:35.330 に答える