错误:摘要已在进行中

时间:2014-09-23 16:58:22

标签: javascript angularjs

我有以下错误:

  

错误:[$ rootScope:inprog] $ digest已在进行中   http://errors.angularjs.org/1.2.16/ $ rootScope / inprog?P0 =%24digest

不完全确定这个问题的根源是什么,或者这究竟是什么意思或者阶段"适用"或者"消化"意思?我阅读了该页面,并了解在范围对象和

上调用apply / digest
element.on('mouseup', function() {
 scope.$apply(function() {
 $scope.doStuff();
 });
});

变为:

$apply = function(fn) {
try {
  fn();
} finally() {
  $digest();
}
}

1 个答案:

答案 0 :(得分:1)

如果在调用$scope.apply函数时调用digest,则可能会发生这种情况。意思是很可能你的scope.apply不是必需的。

  

来自Angular Docs $digest()处理当前作用域及其子作品的所有观察者。通常,您不直接在控制器或指令中调用$ digest()

     

Angular会跟踪我们处理的处理阶段,相关的处理是$ apply和$ digest。尝试重新输入$ digest或$ apply(其中一个已经在进行中)通常是需要修复的编程错误的标志。因此Angular会在发生这种错误时抛出此错误。 Click Here for more details

您的代码提醒了一个需要在早期版本的角度(0.4或0.8)中实现的旧技巧,但就召回而言,您正在使用的角度版本中不需要它。

另请注意,Angular团队为我们提供了diagnose this type of errors的方法:

当您收到此错误时,诊断问题的原因可能相当令人生畏。最好的做法是调查错误中的堆栈跟踪。您需要查找已调用$ apply或$ digest的位置,并找到发生此情况的上下文。

应该有两个电话:

第一个调用是好的$ apply / $ digest,通常会被调用堆栈顶部附近的某个事件触发。

第二个电话是错误的$ apply / $摘要,这是要调查的。

一旦你确定了这个电话,你就可以在堆栈中找到问题所在。

如果在您的应用程序代码中进行了第二次调用,那么您应该查看为什么在$ apply / $摘要中调用此代码。这可能是一个简单的疏忽,也可能适合前面描述的同步/异步方案。

如果第二次调用是在Angular指令内进行的,那么很可能它与前面描述的第二个编程事件触发器场景相匹配。在这种情况下,您可能需要进一步查看树,以便首先触发事件。