我在 AngularJS 中定义了一个服务,app.factory("serviceName", function($rootScope) { .. })
如果我这样做$rootScope.$apply()
了,那会重新评估应用程序中所有控制器的范围,还是只重新评估使用此服务的控制器的范围?
问问题
6089 次
3 回答
5
$digest()仅“刷新”当前范围及其所有子范围。
$apply(exp)计算 exp,然后在根作用域上调用 $digest()。因此调用 $apply() (在任何范围内)会影响所有范围。
如果您调用 $digest() 并且您的操作更改了某些父范围,则不会观察到更改。所以通常你想调用 $apply()。(如果你想尝试通过调用 $digest() 来提高效率,它可能会在以后咬你!)
于 2012-12-17T16:57:41.697 回答
1
每个应用程序只有一个根范围。调用$rootScope.$apply()
将触发一个摘要循环,该循环将对整个范围树进行脏检查。
为避免这种情况,$apply
如果您想对多个同级作用域进行脏检查,请从控制器的作用域或其父作用域调用。
于 2012-12-17T00:59:57.887 回答
1
下面的代码将每两秒记录一次MyCtrl
并记录到控制台,表明任何 $apply 到任何 $scope都会消化所有 scopes。问题是应用函数将在哪个范围内运行。如果它只检查应用范围,则不应记录。在这里拉小提琴。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>
于 2012-12-17T10:56:51.747 回答