当前位置: 首页 > 面试题库 >

AngularJS:调用$ scope。$ apply()时防止错误$ digest已经在进行中

贾建茗
2023-03-14
问题内容

我发现自从以角度构建应用程序以来,我需要越来越多地手动将页面更新到我的范围。

我唯一知道的方法是$apply()从控制器和指令的范围进行调用。问题是它不断向显示以下内容的控制台抛出错误:

错误:$ digest已经在进行中

有谁知道如何避免这种错误或以不同的方式实现相同的目的?


问题答案:

不要使用此模式 -最终将导致更多错误,无法解决。即使您认为它可以修复某些问题,也没有。

您可以$digest通过检查来检查a 是否已经在进行中$scope.$$phase

if(!$scope.$$phase) {
  //$digest or $apply
}

$scope.$$phase将返回,"$digest"或者"$apply"如果正在进行$digest$apply。我认为这些状态之间的区别在于,$digest它将处理当前范围及其子项$apply的监视,并将处理所有范围的监视者。

就@
dnc253而言,如果您发现自己打电话$digest$apply经常打电话,则可能是做错了。通常,由于Angular无法触发DOM事件而需要更新作用域的状态时,我通常需要进行摘要。例如,当一个Twitter引导模态被隐藏时。有时DOM事件在a
$digest进行时触发,有时不触发。这就是为什么我使用这张支票。

如果有人知道,我想知道一种更好的方法。

来自评论:@anddoutoi

angular.js反模式

  1. 不这样做if (!$scope.$$phase) $scope.$apply(),这意味着您$scope.$apply()在调用堆栈中不够高。



 类似资料:
  • 有没有人知道如何避免这个错误,或者实现同样的事情,但以不同的方式?

  • 问题内容: 尝试致电时出现此错误 错误是 问题答案: 复制: 防止在调用$ scope。$ apply()时发生错误$digest。 您收到的错误表明Angular的脏检查已经在进行中。 最新的最佳实践表明,如果要在下一个 摘要 迭代中执行任何代码,则应使用: 上一页反应: (不要使用此方法) 使用安全的申请,例如: 你为什么不反转条件?

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

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

  • 问题内容: 我正在尝试更新$ scope的页面上的一些文本。但我不断收到此错误: 显然我做错了。:)关于如何解决此问题的任何想法?我希望页面更新为作用域中的新变量。 这是我用于更新的代码: HTML: 我还要对每个加载的页面使用ngRoute和单独的控制器,是否与它有关系? 问题答案: 您正在函数内部使用,因此会遇到常见的“已经摘要”错误。您不需要将调用放入$ scope。$ apply(…)块内