複雑なアプリケーションを構築する場合は、選択によってパフォーマンスに影響があることに注意してください。また、より技術的な詳細でマークの回答を完成させたいと思います。
$timeout(callback)は、現在のダイジェスト サイクルが完了するまで待機し (つまり、すべてのモデルと DOM の角度更新)、そのコールバックを実行します (角度モデルに影響を与える可能性があります)。次に$apply
、ルート $scope でフルを起動し、再ダイジェストします。すべての。
一方、 $evalAsync(callback)は、コールバックを現在または次のダイジェスト サイクルに追加します。つまり、ダイジェスト サイクル内 (たとえば、ng-click
ディレクティブから呼び出される関数内) にいる場合、これは何も待機せず、コードはすぐに実行されます。たとえば のような非同期呼び出し内にいる場合setTimeout
、新しいダイジェスト サイクル ( $apply
) がトリガーされます。
したがって、パフォーマンスの観点から$evalAsync
は、コードを実行する前にビューが最新であることが重要でない限り、常に を呼び出す方が良いです。たとえば、要素の幅などの DOm 属性にアクセスする必要がある場合などです。
$timeout、$evalAsync、$digest、$apply の違いについて詳しく知りたい場合は、他の質問に関する私の回答をお読みください: https://stackoverflow.com/a/23102223/1501926
また、必ずドキュメントを読んでください:
$evalAsync は、式がいつ実行されるかについて保証しません。
- 評価をスケジュールした関数の後 (できれば DOM レンダリングの前) に実行されます。
- 式の実行後、少なくとも 1 つの $digest サイクルが実行されます。
注:この関数が $digest サイクルの外で呼び出されると、新しい $digest サイクルがスケジュールされます。ただし、$apply 呼び出し内からモデルを変更するコードを常に呼び出すことをお勧めします。これには、$evalAsync を介して評価されるコードが含まれます。