867 Stimmen

AngularJS : Verhinderung des Fehlers $digest already in progress beim Aufruf von $scope.$apply()

Ich finde, dass ich meine Seite zu meinem Bereich manuell mehr und mehr seit dem Aufbau einer Anwendung in Angular aktualisieren müssen.

Die einzige mir bekannte Möglichkeit, dies zu tun, ist der Aufruf $apply() aus dem Geltungsbereich meiner Kontrolleure und Weisungen. Das Problem dabei ist, dass es einen Fehler in der Konsole auslöst, der lautet :

Fehler: $digest bereits in Bearbeitung

Weiß jemand, wie man diesen Fehler vermeidet oder das Gleiche auf eine andere Weise erreicht?

1voto

SimplGy Punkte 19473

Das Verständnis, dass die Angular-Dokumente die Überprüfung des $$phase eine Anti-Muster habe ich versucht, die $timeout et _.defer zur Arbeit.

Die Timeout- und Deferred-Methoden erzeugen einen Flash von unparsed {{myVar}} Inhalt im Dom wie ein FOUT . Für mich war das nicht akzeptabel. Es lässt mir nicht viel, wenn mir dogmatisch gesagt wird, dass etwas ein Hack ist, und ich keine geeignete Alternative habe.

Das Einzige, was jedes Mal funktioniert, ist:

if(scope.$$phase !== '$digest'){ scope.$digest() } .

Ich verstehe die Gefahr dieser Methode nicht, oder warum sie von Leuten in den Kommentaren und dem Angular-Team als Hack bezeichnet wird. Der Befehl scheint präzise und einfach zu lesen:

"Machen Sie die Verdauung, es sei denn, es findet bereits eine statt"

In CoffeeScript ist es sogar noch hübscher:

scope.$digest() unless scope.$$phase is '$digest'

Was ist das Problem dabei? Gibt es eine Alternative, die kein FOUT erzeugt? $safeApply sieht gut aus, verwendet aber die $$phase Inspektionsmethode.

1voto

jmojico Punkte 1992

Wenn ich den Debugger deaktiviert habe, tritt der Fehler nicht mehr auf. In meinem Fall Der Grund dafür war, dass der Debugger die Codeausführung stoppte.

0voto

Shawn Dotey Punkte 616

Ähnlich wie bei den obigen Antworten, aber dies hat bei mir zuverlässig funktioniert... in einem Service Add:

    //sometimes you need to refresh scope, use this to prevent conflict
    this.applyAsNeeded = function (scope) {
        if (!scope.$$phase) {
            scope.$apply();
        }
    };

0voto

Satish Singh Punkte 1643

Sie können verwenden $timeout um den Fehler zu vermeiden.

$timeout(function () {
    var scope = angular.element($("#myController")).scope();
    scope.myMethod(); 
    scope.$scope();
}, 1);

0voto

Sachin Mishra Punkte 1036

Das Problem ist im Grunde kommen, wenn wir Angular anfordern, um den Digest-Zyklus auszuführen, obwohl seine in Prozess, der Problem zu Angular zu verstehen erstellt wird.
1. Es hat keinen Sinn, scope.$apply() innerhalb der Funktion $timeout aufzurufen, da sie intern dasselbe tut.
2. Der Code geht mit vanilla JavaScript-Funktion, weil seine native nicht angular angular definiert dh setTimeout
3. Zu diesem Zweck können Sie Folgendes verwenden

if(!scope.$$phase){
scope.$evalAsync(function(){

} }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X