2

我在 AngularJS 中定义了一个服务,app.factory("serviceName", function($rootScope) { .. }) 如果我这样做$rootScope.$apply()了,那会重新评估应用程序中所有控制器的范围,还是只重新评估使用此服务的控制器的范围?

4

3 回答 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。问题是应用函数将在哪个范围内运行。如果它只检查应用范围,则不应记录。在这里拉小提琴。MyCtrl2MyCtrl

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 回答