Подтвердить что ты не робот

Ошибка: $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
4b9b3361

Ответ 1

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

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

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

$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();
    }
});

Ответ 2

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

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

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

Ответ 3

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

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

вместо

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

Ответ 5

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