it-swarm.com.ru

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

Я получаю эту ошибку при попытке позвонить 

        function MyCtrl1($scope, $location, $rootScope) {
      $scope.$on('$locationChangeStart', function (event, next, current) {
        event.preventDefault();
        var answer = confirm("Are you sure you want to leave this page?");
        if (answer) {
          $location.url($location.url(next).hash());
          $rootScope.$apply();
        }
      });
    }

MyCtrl1.$inject = ['$scope', '$location', '$rootScope'];

Ошибка

Error: $digest already in progress
29
iJade

Дублировано: Предотвращение ошибки $ digest, уже выполняющейся при вызове $ scope. $ Apply ()

Эта ошибка, которую вы получаете, означает, что грязная проверка Angular уже выполняется.

В самых современных рекомендациях говорится, что мы должны использовать $timeout, если мы хотим выполнить какой-либо код в следующей итерации digest:

$timeout(function() {
  // the code you want to run in the next digest
});

Предыдущий ответ: ( не используйте этот подход )

Используйте безопасное приложение, как это:

$rootScope.$$phase || $rootScope.$apply();

Почему бы вам не перевернуть условие?

$scope.$on('$locationChangeStart', function (event, next, current) {                
    if (confirm("Are you sure you want to leave this page?")) {
        event.preventDefault();
    }
});
61
bmleite

Для других, желающих устранить эту ошибку, стоит отметить, что docs , похоже, предлагают использовать службу $timeout, чтобы гарантировать, что код будет вызываться в одном блоке $apply.

$timeout(function() {
  $scope.someData = someData;
});

Также обсуждается в этот вопрос если вы смотрите мимо принятого ответа.

12
aw04

Использование

$scope.evalAsync(function(){ 
});

вместо

$scope.$apply(function(){
});
2
Hanmant Rachmale

ответ josliber решил похожую проблему с $ digest, которая у меня была. Я просто использовал

$scope.$evalAsync(function(){ 
   // code here
});

Хорошая статья здесь https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm

1
user2217057

Поскольку ваш $ scope. $ Apply () находится внутри среды AngularJs . В общем, я не буду предлагать вам использовать $ apply (), более того, функции $ rootScope. $ Apply () заставляют ваше приложение работать медленно. новый цикл всей вашей сферы.

0
Hazarapet Tunanyan