为什么要使用if(!$ scope$$ phase)$ scope$ apply()作为反模式?

【字号: 日期:2024-04-07浏览:46作者:雯心
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解决为什么要使用if(!$ scope$$ phase)$ scope$ apply()作为反模式??

经过进一步的挖掘,我能够解决是否始终可以安全使用的问题$scope.$apply。简短的答案是肯定的。

长答案:

由于您的浏览器执行Javascript的方式,两个摘要调用不可能 碰撞。

我们编写的JavaScript代码并非一口气运行,而是轮流执行。这些转弯中的每一个从头到尾都是不间断的,当转弯运行时,我们的浏览器中没有其他任何事情发生。(摘自http://jimhoskins.com/2012/12/17/angularjs- and-apply.html)

因此,错误“仅在已经消化的情况下”只能在一种情况下发生:当在另一个$ apply中发出$ apply时,例如:

$scope.apply(function() { // some code... $scope.apply(function() { ... });});

setTimeout ***if (!$scope.$$phase) $scope.$apply()

setTimeout(function () { $scope.$apply(function () {$scope.message = 'Timeout called!'; });}, 2000);

即使这是安全的:

$scope.$apply(function () { setTimeout(function () {$scope.$apply(function () { $scope.message = 'Timeout called!';}); }, 2000);});

什么是 安全的(因为$超时-像所有angularjs助手-已经呼吁$scope.$apply你):

$timeout(function () { $scope.$apply(function () {$scope.message = 'Timeout called!'; });}, 2000);

这也解释了为什么使用的if (!$scope.$$phase)$scope.$apply()是反模式。如果使用$scope.$apply正确的方式,则根本不需要它:例如,在纯js回调中setTimeout。

阅读http://jimhoskins.com/2012/12/17/angularjs-and-apply.html以获得更详细的说明。

解决方法

有时我需要$scope.$apply在代码中使用它,有时它会引发“已消化的摘要”错误。但是,您可以在评论中(以及在Angular Wiki上)阅读:

如果(!$ scope。$$ phase)$ scope。$ apply()不要这样做,这意味着您的$ scope。$apply()在调用堆栈中不够高。

所以现在我有两个问题:

为什么这是反模式?我如何安全地使用$ scope。$ apply?

另一个防止“已消化摘要”错误的“解决方案”似乎正在使用$ timeout:

$timeout(function() { //...});

那是路要走吗?更安全吗?因此,这才是真正的问题:如何 完全 消除“已消化的消化”错误的可能性?

PS:我只在非同步的非angularjs回调中使用$ scope。$ apply。(据我所知,在某些情况下,如果要应用更改,必须使用$ scope。$apply)

相关文章: