$digest() updating parent $rootScope

$digest() updating parent $rootScope

本文关键字:parent rootScope updating digest      更新时间:2023-09-26

我无法理解$digest是如何工作的。根据 Angular $scope.$digest vs $scope.$apply 中给出的答案

" $digest() 将更新当前作用域和任何子作用域。$apply() 将更新每个范围。所以大多数时候$digest()将是你想要的,更有效"

但是在我的 plnkr 中,当我这样做时

$rootScope.company = "Google";  

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

波兰兹罗提 : http://plnkr.co/edit/LTBWTWf7hxlfc5niXsGN?p=preview

我看

了一下你的代码,发现它很有趣!首先,我建议您使用超时值,例如:我将第二个控制器的超时值更改为 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,您可能会遇到不需要的更新,并且您的最终应用程序可能不稳定。

  • $apply :

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

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

  • $digest :

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

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