スコープの特定の属性のステータスに応答するディレクティブがあり、テストでその属性を変更して正しく応答することを確認したい場合、その変更を行うための最良の方法はどれですか。
私はこれらの両方のパターンを見てきました:
scope.$apply(function() {
scope.myAttribute = true;
});
そして
scope.myAttribute = true;
scope.$digest();
それらの違いは何ですか?どちらが優れていますか?
スコープの特定の属性のステータスに応答するディレクティブがあり、テストでその属性を変更して正しく応答することを確認したい場合、その変更を行うための最良の方法はどれですか。
私はこれらの両方のパターンを見てきました:
scope.$apply(function() {
scope.myAttribute = true;
});
そして
scope.myAttribute = true;
scope.$digest();
それらの違いは何ですか?どちらが優れていますか?
回答:
scope.$digest()
現在のスコープとそのすべての子に対してウォッチャーを起動します。scope.$apply
渡された関数を評価して実行し$rootScope.$digest()
ます。
1つ目は、現在のスコープとその子のウォッチャーを評価する必要があるため、より高速です。2つ目はウォッチャーと$rootScope
そのすべての子スコープを評価する必要があるため、速度が遅くなります。
ウォッチャーの1つでエラーが発生し、を使用すると、エラーはサービスscope.$digest
経由では処理されない$exceptionHandler
ため、例外を自分で処理する必要があります。内部でブロックをscope.$apply
使用し、try-catch
すべての例外をに渡します$exceptionHandler
。
$digest
現在のスコープだけでなく、そのすべての子に対してもウォッチャーを起動します。
ドキュメント自体が言及しているように、$ digestサイクルはいつでも実行されます$scope.$apply
。スコープに関する開発者ガイドに従って
式を評価した後、$ applyメソッドは$ digestを実行します。$ digestフェーズでは、スコープはすべての$ watch式を調べ、以前の値と比較します。
そして、スコープAPI ドキュメントに従って
通常、コントローラーやディレクティブで$ digest()を直接呼び出すことはありません。代わりに(通常はディレクティブ内から)$ apply()を呼び出すと、$ digest()が強制されます。
したがって$digest
、明示的にを呼び出さないでください$apply
。メソッドを呼び出すと、ダイジェストサイクルがトリガーされます。
$digest
もスコープの子で呼び出すこと?