web-dev-qa-db-fra.com

Erreur: $ digest déjà en cours

J'obtiens cette erreur en essayant d'appeler 

        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'];

L'erreur est

Error: $digest already in progress
29
iJade

Dupliqué: Empêche l'erreur $ digest déjà en cours lors de l'appel de $ scope. $ Apply ()

Cette erreur que vous obtenez signifie que la vérification en profondeur d'Angular est déjà en cours.

Les meilleures pratiques les plus récentes disent que nous devrions utiliser $timeout si nous voulons exécuter du code lors de la prochaine itération digest

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

Réponse précédente: ( n'utilisez pas cette approche )

Utilisez un coffre-fort, comme ceci:

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

Pourquoi n'inversez-vous pas la condition?

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

Pour les autres personnes cherchant à résoudre cette erreur, il convient de noter que les docs semblent suggérer l’utilisation du service $timeout pour garantir que le code sera appelé dans un seul bloc $apply.

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

Également discuté dans cette question si vous regardez au-delà de la réponse acceptée.

12
aw04

Utilisation

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

au lieu de

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

la réponse de josliber a résolu un problème similaire à $ digest que je rencontrais. Je viens d'utiliser

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

Bon article ici https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm

1
user2217057

Parce que votre $ scope. $ Apply () est dans l'environnement AngularJs . En général, je ne vous suggérerai pas d'utiliser $ apply (), de plus, avec les fonctions $ rootScope. $ Apply (), votre application s'exécute lentement. un nouveau cycle de toute votre portée.

0
Hazarapet Tunanyan