AngularJSで定義されたサービスがあります。定義したapp.factory("serviceName", function($rootScope) { .. })
場合$rootScope.$apply()
、アプリ内のすべてのコントローラーのスコープを再評価しますか、それともこのサービスを使用するコントローラーのスコープのみを再評価しますか?
3 に答える
$digest()は、現在のスコープとそのすべての子スコープのみを「フラッシュ」します。
$apply(exp)は exp を評価し、ルート スコープで $digest() を呼び出します。したがって、(任意のスコープで) $apply() を呼び出すと、すべてのスコープに影響します。
$digest() を呼び出し、アクションが親スコープを変更した場合、その変更は監視されません。したがって、通常は $apply() を呼び出します。($digest() を呼び出してより効率的にしようとする場合は、後で噛まれる可能性があります!)
以下のコードは、2秒ごとにログに記録され、コンソールにMyCtrl
記録されます。これは、$applyを任意の$scopeに適用すると、すべてのスコープがダイジェストされることを示しています。問題は、適用された関数がどのスコープに対して実行されるかです。適用されたスコープのみをダーティチェックする場合は、ログに記録しないでください。ここでフィドル。MyCtrl2
MyCtrl
var mod = angular.module('MyApp', []);
mod.controller('MyCtrl', function($scope) {
$scope.value = function() {
console.log('MyCtrl');
return 'value';
};
setInterval(function() {
$scope.$apply()
}, 2000);
});
mod.controller('MyCtrl2', function($scope) {
$scope.value2 = function() {
console.log('MyCtrl2');
return 'value 2';
};
});
<div ng-app="MyApp">
<div ng-controller="MyCtrl">{{value()}}</div>
<div ng-controller="MyCtrl2">{{value2()}}</div>
</div>
アプリケーションごとに 1 つのルート スコープしかありません。を呼び出すと、スコープ ツリー全体$rootScope.$apply()
をダーティ チェックするダイジェスト サイクルがトリガーされます。
これを回避するには、$apply
複数の兄弟スコープをダーティ チェックする場合は、コントローラーのスコープまたはその親スコープから呼び出します。