AngularJSのメリットについて説明するとき、他のJSフレームワークに比べてAngularの主な利点として、双方向のデータバインディングがよく宣伝されています。 Digging deeper )、ドキュメントはこのプロセスを示唆していますイベント駆動型の測定ではなくダーティチェックを介して行われます。最初は、ダイジェストループは定期的にメソッドをバックグラウンドで起動し、各サイクル中にすべての_$watch
_ esをチェックすることで機能しているようです。ただし、さらに読むと、ダイジェストループは実際にはrootScope.digest()
によってトリガーされているようです。これは_$.apply
_によってトリガーされ、次にイベント(!)によってトリガーされます。 _ng-click
_を介して呼び出されるonClickイベント.
しかし、これはどのようになりますか? Angular 変更リスナーを使用しない と思ったので、ダイジェストループは実際にどのように動作しますか?Does Angularダイジェストループが内部で自動的に開始されますか、それともイベントによってダイジェストループがトリガーされますか?ダイジェストループが自動的に実行される場合、どれくらいの頻度で実行されますか?
いくつかの明確化のポイント:
$.apply()
を呼び出して強制できます。角度ダイジェストがトリガーされます-ポーリングでは発生しません。
コードが実行された後、コードが実行され、angularがダイジェストをトリガーします。
例:
element.on('click', function() {
$scope.$apply(function() {
// do some code here, after this, $digest cycle will be triggered
});
});
Angularは、コンパイル/リンクフェーズの後に$ digestもトリガーします。
Compile > Link > Digest
そして、どのくらいのダイジェストサイクルがトリガーされますか?スコープ変数がどれだけ早く安定するかによります。通常、それを決定するには少なくとも2サイクルかかります。
主な質問への短い直接的な答えは「いいえ」です、angularは自動的にダイジェストループをトリガーしません。
TL; DR回答:
ダイジェストループは、Angularスコープインスタンスに関連付けられたPOJOモデルに対してダーティーチェックを実行するように設計されているため、モデルが変更される可能性がある場合にのみ実行する必要があります。ブラウザ内で実行される単一ページWebアプリケーションでは、以下のアクション/イベントは、モデルの変更につながる可能性があります
同様に、Angularトリガーダイジェストループなど
私の理解からこれらのボーナスの質問に答えてみてください:
したがって、angularパフォーマンスの落とし穴を回避するためのいくつかの重要なプラクティス
私はこれが起こると信じています。 AngularJSは、モデルの変更はユーザーインタラクションでのみ発生するというスマートな仮定を行いました。これらの相互作用は、
対応するイベントのAngularJSディレクティブは、式の実行を$ scope。$ applyにラップします。これは、彼の例の@pixelbitsで示されています。これにより、ダイジェストサイクルが発生します。
AngularJSがダイジェストループをトリガーする他のイベントもあります。 $ timeoutサービスと$ intervalサービスは、そのような2つの例です。これらのサービスにラップされたコードも、ダイジェストループの実行につながります。ダイジェストサイクルの実行を引き起こす可能性がある他のいくつかのイベント\サービスがあるかもしれませんが、これらは主要なものです。
これが、Angularコンテキスト外でモデルを変更しても、ウォッチとバインディングが更新されない理由です。そのため、$ scope。$ applyを明示的に呼び出す必要があります。 jQueryプラグイン。