$ digest()更新父$ rootScope

时间:2016-03-15 08:32:59

标签: javascript angularjs

我无法理解$ digest的工作原理。根据{{​​3}}

中给出的答案

" $ digest()将更新当前范围和任何子范围。 $ apply()将更新每个范围。因此,大多数时候$ digest()将是你想要的,更高效的#34;

但是当我做的时候,我的plnkr

$rootScope.company = "Google";  

在第二个控制器上调用$ digest(),更改也会在父范围内更新。我犯了什么错误吗?

Plnkr:Angular $scope.$digest vs $scope.$apply

2 个答案:

答案 0 :(得分:0)

我已经看了你的代码,我发现它非常有趣! 首先,我建议您使用超时值,例如:我已将第二个控制器的超时值更改为1000毫秒,并发现现在这两家公司已经使用了Google'第二个和第三个。

但除此之外,我注意到在第三个控制器中你将初始化包装在 $ apply 中,将第三个控制器的代码转换为

app.controller('ThirdCtrl', function($scope, $rootScope) {
 $scope.name = 'Third';

  setTimeout(function() {
      $scope.name = "I'm Third";
     $rootScope.company = "Amazon";
     $scope.$digest();
  },500);
});

肯定解决了"错误"因为在第三个控制器中调用的 $ apply 也在更新 $ rootScope ,正常工作! :d

无论如何,对于此解决方案,我建议您使用 $ scope 而不是 $ rootScope ,您可能会遇到不需要的更新,而您的最终应用可能不稳定

答案 1 :(得分:0)

  • $ apply:

是负责通过在rootScope上调用$ digest($ rootScope。$ digest())来执行应用程序中所有可用范围的观察者的整个列表的函数。

这意味着每次调用$ apply()时,我们都会执行应用程序的新生命周期循环。

  • $ digest:

AngularJS以周期执行,称为 $ digest ,此 $ digest 负责评估模型和视图之间的更改,并更新UI和模型以使其保持同步

如上所述 $ apply在rootScope上调用$ digest ,这意味着它会重新评估所有可用范围内的所有观察者,这可能会导致大范围层次结构的性能下降。