Ich benutze AngularJS jetzt schon eine Weile und habe festgestellt, dass ab und zu $ timeout verwendet werden muss (scheint normalerweise ein jQuery-Plugin zu initiieren).
Vor kurzem habe ich versucht, den Digest-Zyklus besser und gründlicher zu verstehen, und bin auf die Funktion $ evalAsync gestoßen .
Es scheint, dass diese Funktion ähnliche Ergebnisse liefert $timeout
, nur dass Sie sie nicht verzögern. Jedes Mal $timeout
, wenn ich es verwendet habe, war es mit einer Verzögerung von 0, also frage ich mich jetzt, ob ich es $evalAsync
stattdessen hätte verwenden sollen .
Gibt es grundlegende Unterschiede zwischen den beiden? Welche Fälle würden Sie übereinander verwenden? Ich möchte ein besseres Gefühl dafür bekommen, wann ich welches verwenden soll.
quelle
Beachten Sie beim Erstellen komplexer Anwendungen, dass sich die Leistung auf Ihre Auswahl auswirkt. Außerdem möchte ich die Antwort von Mark mit weiteren technischen Details vervollständigen:
$ timeout (Rückruf) wartet, bis der aktuelle Digest-Zyklus abgeschlossen ist (dh alle Modelle und das DOM werden im Winkel aktualisiert), führt dann seinen Rückruf aus, der sich möglicherweise auf das Winkelmodell auswirkt
$apply
, und startet dann einen vollständigen Wert im Root-Bereich $ und redigest alles.$ evalAsync (Rückruf) hingegen fügt den Rückruf dem aktuellen oder nächsten Digest-Zyklus hinzu. Das heißt, wenn Sie sich innerhalb eines Digest-Zyklus befinden (zum Beispiel in einer Funktion, die von einer
ng-click
Direktive aufgerufen wird ), wartet dies nicht auf irgendetwas, der Code wird sofort ausgeführt. Wenn Sie sich in einem asynchronen Aufruf befinden, z. B. asetTimeout
, wird ein neuer Digest-Zyklus ($apply
) ausgelöst.In Bezug auf die Leistung ist es daher immer besser, aufzurufen
$evalAsync
, es sei denn, es ist für Sie wichtig, dass die Ansicht vor der Ausführung Ihres Codes auf dem neuesten Stand ist, z. B. wenn Sie Zugriff auf ein DOm-Attribut wie die Elementbreite und dergleichen benötigen.Wenn Sie weitere Informationen zur Unterscheidung zwischen $ timeout, $ evalAsync, $ Digest, $ Apply wünschen, lade ich Sie ein, meine Antwort auf diese andere Frage zu lesen: https://stackoverflow.com/a/23102223/1501926
Lesen Sie auch unbedingt die Dokumentation :
quelle
x
direkt aus Ihrem Bereich und nicht aus dem DOM lesen , damit Sie nicht auf etwas warten müssen. Außerdem sollten Sieng-style
CSS besser verwenden als die veraltetewidth
Eigenschaft. Wenn Sie weitere Hilfe benötigen, öffnen Sie bitte eine neue Frage zu StackOverflow.