我发现自从以角度构建应用程序以来,我需要越来越多地手动将页面更新到我的范围。
我唯一知道的方法是$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反模式
- 不这样做
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(…)块内