Ошибка: дайджест уже выполняется

У меня есть следующая ошибка:

Ошибка: [$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 ответ

Решение

Это может произойти, если вы позвоните $scope.apply в то время как digest функция вызывается. Смысл и, скорее всего, ваш scope.apply не обязателен.

Из угловых документов: $digest() Обрабатывает всех наблюдателей текущего объема и его дочерних элементов. Обычно вы не звоните $digest() непосредственно в контроллерах или в директивах.

Angular отслеживает, в какой фазе обработки мы находимся, соответствующими являются $apply и $digest. Попытка повторно ввести $digest или $apply, пока один из них уже выполняется, обычно является признаком ошибки программирования, которую необходимо исправить. Так что Angular выдаст эту ошибку, когда это произойдет. Нажмите здесь для более подробной информации

Ваш код напоминает старый трюк, который должен был быть реализован в более ранних версиях Angular(0,4 или 0,8), но, насколько вы помните, он не требуется в используемой вами версии Angular.

Также обратите внимание, что Angular Team предложила нам способ диагностики этого типа ошибок:

Когда вы получаете эту ошибку, может быть довольно сложно определить причину проблемы. Наилучший способ - исследовать трассировку стека от ошибки. Вам нужно найти места, где были вызваны $apply или $digest, и найти контекст, в котором это произошло.

Там должно быть два звонка:

Первый вызов - это хороший $apply/$digest, который обычно запускается каким-либо событием в верхней части стека вызовов.

Второй вызов - плохой $apply/$digest, и это тот, который нужно исследовать.

Как только вы определили этот вызов, вы идете вверх по стеку, чтобы увидеть, в чем проблема.

Если в коде вашего приложения был сделан второй вызов, вам следует выяснить, почему этот код был вызван из $apply/$digest. Это может быть простой недосмотр или, возможно, он соответствует сценарию синхронизации / асинхронности, описанному ранее.

Если второй вызов был сделан внутри директивы Angular, то, вероятно, он соответствует второму сценарию программного запуска события, описанному ранее. В этом случае вам может понадобиться посмотреть вверх по дереву, чтобы спровоцировать событие в первую очередь.

Другие вопросы по тегам