我无法理解$ digest的工作原理。根据{{3}}
中给出的答案" $ digest()将更新当前范围和任何子范围。 $ apply()将更新每个范围。因此,大多数时候$ digest()将是你想要的,更高效的#34;
但是当我做的时候,我的plnkr
$rootScope.company = "Google";
在第二个控制器上调用$ digest(),更改也会在父范围内更新。我犯了什么错误吗?
答案 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)
是负责通过在rootScope上调用$ digest($ rootScope。$ digest())来执行应用程序中所有可用范围的观察者的整个列表的函数。
这意味着每次调用$ apply()时,我们都会执行应用程序的新生命周期循环。
AngularJS以周期执行,称为 $ digest ,此 $ digest 负责评估模型和视图之间的更改,并更新UI和模型以使其保持同步
如上所述 $ apply在rootScope上调用$ digest ,这意味着它会重新评估所有可用范围内的所有观察者,这可能会导致大范围层次结构的性能下降。