我在AngularJS中使用app.factory("serviceName", function($rootScope) { .. })
定义了一项服务
如果我$rootScope.$apply()
,那会重新评估应用程序中所有控制器的范围,还是只重新评估使用此服务的控制器的范围?
答案 0 :(得分:5)
$digest()仅“刷新”当前范围及其所有子范围。
$apply(exp)计算exp,然后在根作用域上调用$ digest()。所以调用$ apply()(在任何范围内)都会影响所有范围。
如果您调用$ digest()并且您的操作更改了某个父范围,则不会观察到更改。所以通常你想调用$ apply()。 (如果你想通过调用$ digest()来尝试提高效率,那么它可以在以后咬你!)
答案 1 :(得分:1)
每个应用程序只有一个根作用域。调用$rootScope.$apply()
将触发一个摘要周期,将检查整个范围树。
要避免这种情况,如果要对多个同级作用域进行脏处理,请从控制器的作用域或其父作用域调用$apply
。
答案 2 :(得分:1)
下面的代码会每两秒将MyCtrl
和MyCtrl2
记录到控制台,建议任何$适用于任何$ scope ,将消化所有范围即可。问题是应用函数的运行范围。如果脏了只检查应用的范围,则不应记录MyCtrl
。小提琴here。
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>