当前位置: 首页 > 知识库问答 >
问题:

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

别帅
2023-03-14

有时我需要在代码中使用$scope.$apply,有时它会引发“摘要已经在进行中”错误。因此,我开始寻找解决这个问题的方法,并发现这个问题:AngularJS:prevention error$digest在调用$scope.$apply()时已经在进行。然而,在评论中(以及有棱角的wiki上),您可以读到:

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

所以现在我有两个问题:

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

这是该走的路吗?更安全吗?所以真正的问题是:我如何才能完全消除“摘要已经在进行中”错误的可能性?

PS:我只在不html" target="_blank">同步的非AngularJS回调中使用$scope.$apply。(据我所知,在这些情况下,如果您希望应用更改,必须使用$scope.$apply)

共有1个答案

祁柏
2023-03-14

经过更多的挖掘,我能够解决使用$scope.$apply是否总是安全的问题。简短的回答是肯定的。

长答:

由于浏览器执行Javascript的方式,两个摘要调用不可能偶然发生冲突。

$scope.apply(function() {
  // some code...
  $scope.apply(function() { ... });
});
setTimeout(function () {
    $scope.$apply(function () {
        $scope.message = "Timeout called!";
    });
}, 2000);
$scope.$apply(function () {
    setTimeout(function () {
        $scope.$apply(function () {
            $scope.message = "Timeout called!";
        });
    }, 2000);
});
$timeout(function () {
    $scope.$apply(function () {
        $scope.message = "Timeout called!";
    });
}, 2000);

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

阅读http://jimhoskins.com/2012/12/17/Angularjs-and-apply.html了解更详细的解释。

 类似资料:
  • 问题内容: 有时我需要在代码中使用它,有时它会引发“已消化的摘要”错误。但是,您可以在评论中(以及在Angular Wiki上)阅读: 如果(!$ scope。$$ phase)$ scope。$ apply()不要这样做,这意味着您的$ scope。$ apply()在调用堆栈中不够高。 所以现在我有两个问题: 为什么这是反模式? 我如何安全地使用$ scope。$ apply? 另一个防止“已

  • 问题内容: 当我通过Angular应用中的websocket接收数据时,我一直在使用它来更新模型的绑定。但是它实际上是做什么的,为什么需要调用它才能完成更新? 问题答案: 从Angular文档: $ apply()用于从角度框架外部以角度执行表达式。(例如,来自浏览器DOM事件,setTimeout,XHR或第三方库)。因为我们正在调用角度框架,所以我们需要执行异常处理的适当范围生命周期,并执行监

  • 问题内容: 我只想知道火热的使用方法。在控制器内,以下代码可以正常工作,并且在3秒后更新DOM: 但是通过使用 没发生什么事… 我以为他们做同样的事情。我怎么了? 问题答案: 并有一些异同。它们的相似之处在于它们都检查了更改内容并更新了UI并触发了所有观察程序。 两者之间的区别是它们的调用方式。被调用而没有任何参数。具有在执行任何更新之前将要执行的功能。 另一个区别是它们的影响。将更新当前范围和任

  • 问题内容: 我不知道如何使用和。官方文档没有帮助。 我不明白的是: 他们连接到DOM吗? 如何更新对模型的DOM更改? 它们之间的连接点是什么? 我尝试了本教程,但这需要对它的理解并且理所当然。 做什么和做什么,以及如何正确使用它们? 问题答案: 您需要了解AngularJS的工作原理才能理解它。 消化周期和作用域 首先,AngularJS定义了所谓的 摘要循环 的概念。这个周期可以看作是一个循环

  • 问题内容: 我想标题很清楚我要问的内容。我创建了这个小提琴:http : //jsfiddle.net/Sourabh_/HB7LU/13142/ 在小提琴中,我试图复制一个场景。这只是一个示例,但是在AJAX调用中,如果我不使用该列表,则不会更新。我想知道每次进行AJAX调用来更新列表时是否可以安全使用?是否可以使用其他机制? 我编写的用于复制场景的代码(与小提琴相同): 的HTML JS 问题

  • 问题内容: 在AngularJS范围内。在每个事件处理程序(输入指令的keydown / input事件,select指令的change事件等)上调用$ apply()。 看小例子。似乎ngRepeat在每次击键时都会重新计算并重绘,尽管事实是另一个作用域发生了更改。 知道这种决定的理由将是很有趣的。 问题答案: 希望有AngularJS的作者来做,但是我相信$ digest()必须在$ root