Manchmal muss ich $scope.$apply
meinen Code verwenden und manchmal wird der Fehler "Digest bereits in Bearbeitung" ausgegeben. Also fing ich an, einen Weg zu finden und fand diese Frage: AngularJS: Verhindern Sie, dass der Fehler $ Digest bereits ausgeführt wird, wenn Sie $ scope aufrufen. $ Apply () . In den Kommentaren (und im eckigen Wiki) können Sie jedoch lesen:
Tun Sie dies nicht, wenn (! $ Scope. $$ Phase) $ scope. $ Apply () bedeutet, dass Ihr $ scope. $ Apply () im Aufrufstapel nicht hoch genug ist.
Jetzt habe ich zwei Fragen:
- Warum genau ist das ein Anti-Muster?
- Wie kann ich $ scope. $ Apply sicher verwenden?
Eine andere "Lösung", um den Fehler "Digest bereits in Bearbeitung" zu verhindern, scheint die Verwendung von $ timeout zu sein:
$timeout(function() {
//...
});
Ist das der richtige Weg? Ist es sicherer? Hier ist also die eigentliche Frage: Wie kann ich die Möglichkeit eines Fehlers "Digest bereits in Bearbeitung" vollständig ausschließen ?
PS: Ich verwende nur $ scope. $ Apply in nicht eckigen Rückrufen, die nicht synchron sind. (Soweit ich weiß, sind dies Situationen, in denen Sie $ scope verwenden müssen. $ apply, wenn Sie möchten, dass Ihre Änderungen angewendet werden.)
digest already in progress
Fehler
scope
von innerhalb des Winkels oder von außerhalb des Winkels manipulieren . Demnach wissen Sie immer, ob Sie anrufen müssenscope.$apply
oder nicht. Und wenn Sie denselben Code sowohl für die Winkel- als auch für diescope
Nichtwinkelmanipulation verwenden, machen Sie es falsch. Er sollte immer getrennt sein. Wenn Sie also auf einen Fall stoßenscope.$$phase
, in dem Sie überprüfen müssen , ist Ihr Code dies nicht richtig entworfen, und es gibt immer einen Weg, es "richtig" zu machen