2013-02-12 5 views
29

ich diesen Fehler beim Versuch,

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

Fehler zu nennen ist

Error: $digest already in progress 
+0

Dies ist eine sehr alte Post, aber immer noch können Sie auf dieses Thema beziehen: http://www.boynux.com/angularjs-apply-explained/ Ich habe versucht, $ Digest in progress sehr einfach zu erklären. – Boynux

Antwort

59

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

Dieser Fehler Sie bekommen werden bedeutet, Angulars schmutzige Überprüfung ist bereits in Arbeit.

Die neuesten Best Practices sagen, dass wir $timeout verwenden sollten, wenn wir Iteration ausführen möchten beliebigen Code im nächsten verdauen:

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

Zurück Antwort: (don't use this approach)

Verwenden Sie eine sichere Anwendung, so:

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

Warum invertieren Sie den Zustand nicht?

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

aktualisiert meinen ganzen Code ... es zeigt nicht den Fehler jetzt, aber es dient nicht dem Zweck, um zur nächsten Ansicht zu gehen – iJade

+0

Besteht es die 'if (Antwort) {' Bedingung? Was ist der Inhalt von 'next'? – bmleite

+0

Inhalt in nächsten ist http: // localhost: 8000/app/index.html #/view2 – iJade

12

Für andere suchen, um diese Fehler zu beheben, ist es erwähnenswert, dass die docs scheinen die $timeout Dienst vorschlagen mit dem Code, um sicherzustellen, wird in einem einzigen $apply Block aufgerufen werden.

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

Auch in this question diskutiert, wenn Sie die akzeptierte Antwort aussehen Vergangenheit.

+0

Ich habe den gleichen Fehler bekommen, aber mit diesem Code gelöst this.can Sie bitte sagen Sie mir, wie funktioniert das? –

0

Da Ihr $ scope. $ Apply() ist innerhalb AngularJS Umgebung .Im allgemeinen ich werde Sie nicht den Eindruck erwecken $ verwenden apply(), außerdem von $ rootScope. $ Apply() Funktionen der Anwendung langsam laufen zu lassen. Es führt einen neuen Zyklus Ihres gesamten Umfangs durch.

2

Verwenden

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

statt

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

Es hat funktioniert, aber ich musste $ scope verwenden. $ EvalAsync (function() { }); – sand

Verwandte Themen