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

为什么要使用if(!$ scope。$$ phase)$ scope。$ apply()作为反模式?,第1张

为什么要使用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 pre...  $scope.apply(function() { ... });});

如果* 我们在纯的非angularjs回调中使用$ scope.apply,则 不会 出现这种情况,例如。所以下面的代码是100%防d有
没有 必要做一个

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以获得更详细的说明。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5642019.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存