2013-02-12 5 views
29

sto ottenendo questo errore durante il tentativo di chiamare

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

errore è

Error: $digest already in progress 
+0

Questo è un post molto vecchio, ma ancora si può fare riferimento a questo post: http://www.boynux.com/angularjs-apply-explained/ Ho cercato di spiegare $ digest in progress molto semplice. – Boynux

risposta

59

duplicato: Prevent error $digest already in progress when calling $scope.$apply()

Tale errore hai trovato significa che il controllo sporco di Angular è già in corso.

migliori pratiche più recenti dicono che dovremmo usare $timeout se vogliamo eseguire qualsiasi codice nel prossimo digerire iterazione:

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

risposta precedente: (don't use this approach)

Utilizzare un sicuro applicare, come questo:

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

Perché non si inverte la condizione?

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

aggiornato il mio intero codice ... non mostra l'errore ora ma non serve allo scopo, per passare alla vista successiva – iJade

+0

Passa la condizione 'if (risposta) {'? Qual è il contenuto di 'prossimo'? Il contenuto di – bmleite

+0

nel prossimo è http: // localhost: 8000/app/index.html #/view2 – iJade

12

Per gli altri che cercano di risolvere questo errore, vale la pena notare che il docs sembrano suggerire utilizzando il servizio $timeout per garantire il codice sarà chiamato in un unico blocco $apply.

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

Anche discusso in this question se si guarda oltre la risposta accettata.

+0

mi stavo facendo lo stesso errore ma usando solo questo codice ho risolto questo problema. Per favore, dimmi come funziona? –

0

Perché il vostro $ portata. $ Applicare() si trova all'interno AngularJs ambiente .In generale, non voglio suggerire di utilizzare $ applicare(), per di più di $ rootScope. $ Applicare (funzioni) rendono l'applicazione eseguita lentamente. Esegue un nuovo ciclo dell'intero ambito.

2

Usa

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

invece di

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

Ha funzionato, ma ho dovuto usare $ scope. $ EvalAsync (function() { }); – sand