AngularJS服务rootscope

时间:2012-12-16 23:43:37

标签: javascript angularjs

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

3 个答案:

答案 0 :(得分:5)

$digest()仅“刷新”当前范围及其所有子范围。

$apply(exp)计算exp,然后在根作用域上调用$ digest()。所以调用$ apply()(在任何范围内)都会影响所有范围。

如果您调用$ digest()并且您的操作更改了某个父范围,则不会观察到更改。所以通常你想调用$ apply()。 (如果你想通过调用$ digest()来尝试提高效率,那么它可以在以后咬你!)

答案 1 :(得分:1)

每个应用程序只有一个根作用域。调用$rootScope.$apply()将触发一个摘要周期,将检查整个范围树

要避免这种情况,如果要对多个同级作用域进行脏处理,请从控制器的作用域或其父作用域调用$apply

答案 2 :(得分:1)

下面的代码会每两秒将MyCtrlMyCtrl2记录到控制台,建议任何$适用于任何$ 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>​
相关问题