Warum benutzt man if (! $ Scope. $$ phase) $ scope. $ Apply () ein Anti-Pattern?

Manchmal muss ich verwenden $scope.$apply in meinem code und manchmal wirft es einen "digest bereits in progress" - Fehler. So begann ich einen Weg zu finden, um das gefunden und diese Frage: AngularJS : Vermeiden Sie den Fehler, $digest, die bereits im Gange beim Aufruf von $scope.$anwenden(). Aber in den Kommentaren (und auf den eckigen wiki) kann man Lesen:

Nicht tun, wenn (!$scope.$$phase) $scope.$apply(), bedeutet dies, dass Ihre $scope.$Anwendung (die) nicht hoch genug in den call-stack.

So, jetzt habe ich zwei Fragen:

  1. Warum genau ist das ein anti-pattern?
  2. Wie kann ich sicher verwenden $scope.$bewerben?

Andere "Lösung" um zu verhindern, dass "digest bereits in progress" - Fehler scheint zu sein, mit $timeout:

$timeout(function() {
  //...
});

Ist, dass der Weg zu gehen? Ist es sicherer? Also hier die eigentliche Frage: Wie kann ich ganz beseitigen die Möglichkeit, ein "digest bereits in progress" - Fehler?

PS: ich bin nur die Verwendung von $scope.$gelten in nicht-angularjs-Rückrufe sind nicht synchron. (soweit ich weiß, das sind Situationen, in denen müssen Sie die Verwendung von $scope.$gelten, wenn Sie möchten, dass Ihre änderungen werden angewendet)

Kommentar zu dem Problem
Aus meiner Erfahrung sollte man immer wissen, wenn Sie manipuliert werden scope innerhalb von eckigen oder von außen gewinkelt. So nach diesem wissen Sie immer, wenn Sie anrufen müssen scope.$apply oder nicht. Und wenn Sie mit dem gleichen code für beide gewinkelt/nicht gewinkelt scope manipulation, dann machst du es falsch, es sollte immer getrennt... also im Grunde, wenn Sie laufen in eine Falle, wo Sie brauchen, um zu überprüfen, scope.$$phase, Ihr code ist nicht darauf ausgelegt, in der richtigen Weise, und es gibt immer einen Weg, es zu tun 'der richtige Weg' Kommentarautor: doodeec
ich bin nur mit diesem nicht-Winkel-Rückrufe (!) Dies ist der Grund, warum ich verwirrt bin Kommentarautor: Dominik Goltermann
wenn es nicht eckig, es würde nicht werfen digest bereits in progress - Fehler Kommentarautor: doodeec
das ist, was ich dachte. Die Sache ist die: es muss nicht immer werfen Sie den Fehler. Nur einmal in eine Weile. Meine suspection ist, dass das anwenden kollidiert zufällig mit einem anderen verdauen. Ist das möglich? Kommentarautor: Dominik Goltermann
Ich glaube nicht, dass das möglich ist, wenn der Rückruf ist streng nicht-eckige Kommentarautor: doodeec

InformationsquelleAutor der Frage Dominik Goltermann | 2014-03-12

Schreibe einen Kommentar