Ошибка: $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
Ответы
Ответ 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(){
});
Ответ 4
josliber ответ решил аналогичную проблему $digest, которую я имел. Я просто использовал
$scope.$evalAsync(function(){
// code here
});
Хорошая статья здесь
https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm
Ответ 5
Потому что ваш $scope. $apply() находится внутри среды AngularJs. В общем, я не буду предлагать вам использовать $apply(), более того, $rootScope. $apply() приложение запускается медленно. Оно запускает новый цикл всей вашей области.