Sie müssen wissen, wie AngularJS funktioniert, um es zu verstehen.
Digest-Zyklus und $ scope
AngularJS definiert in erster Linie ein Konzept eines sogenannten Digest-Zyklus . Dieser Zyklus kann als Schleife betrachtet werden, in der AngularJS prüft, ob Änderungen an allen Variablen vorgenommen wurden, die von allen $scope
s überwacht werden . Wenn Sie also $scope.myVar
in Ihrem Controller definiert haben und diese Variable zum Überwachen markiert wurde , weisen Sie AngularJS implizit an, die Änderungen myVar
in jeder Iteration der Schleife zu überwachen .
Eine natürliche Folgefrage wäre: Ist alles damit verbunden $scope
, beobachtet zu werden? Zum Glück nein. Wenn Sie auf Änderungen an jedem Objekt in Ihrem Objekt $scope
achten würden, würde die Auswertung einer Digest-Schleife schnell Ewigkeiten dauern und Sie würden schnell auf Leistungsprobleme stoßen. Aus diesem Grund hat uns das AngularJS-Team zwei Möglichkeiten gegeben, eine $scope
Variable als überwacht zu deklarieren (siehe unten).
$ watch hilft dabei, auf $ scope-Änderungen zu achten
Es gibt zwei Möglichkeiten, eine $scope
Variable als überwacht zu deklarieren .
- Indem Sie es in Ihrer Vorlage über den Ausdruck verwenden
<span>{{myVar}}</span>
- Durch manuelles Hinzufügen über den
$watch
Dienst
Anzeige 1) Dies ist das häufigste Szenario, und ich bin sicher, dass Sie es schon einmal gesehen haben, aber Sie wussten nicht, dass dadurch eine Uhr im Hintergrund erstellt wurde. Ja, das hatte es! Durch die Verwendung von AngularJS-Direktiven (z. B. ng-repeat
) können auch implizite Uhren erstellt werden.
Anzeige 2) So erstellen Sie Ihre eigenen Uhren . $watch
Mit dem Dienst können Sie Code ausführen, wenn sich ein an den angehängter Wert $scope
geändert hat. Es wird selten verwendet, ist aber manchmal hilfreich. Wenn Sie beispielsweise bei jeder Änderung von 'myVar' Code ausführen möchten, können Sie Folgendes tun:
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
$ apply ermöglicht die Integration von Änderungen in den Digest-Zyklus
Sie können sich die $apply
Funktion als einen Integrationsmechanismus vorstellen . Sie sehen, jedes Mal, wenn Sie eine beobachtete Variable$scope
ändern , die direkt an das Objekt angehängt ist, weiß AngularJS, dass die Änderung stattgefunden hat. Dies liegt daran, dass AngularJS diese Änderungen bereits überwachen konnte. Wenn dies also in Code geschieht, der vom Framework verwaltet wird, wird der Digest-Zyklus fortgesetzt.
Manchmal möchten Sie jedoch einen Wert außerhalb der AngularJS-Welt ändern und sehen, dass sich die Änderungen normal ausbreiten. Beachten Sie Folgendes: Sie haben einen $scope.myVar
Wert, der im $.ajax()
Handler eines jQuery geändert wird . Dies wird irgendwann in der Zukunft geschehen. AngularJS kann es kaum erwarten, da dies nicht angewiesen wurde, auf jQuery zu warten.
Um dies anzugehen, $apply
wurde eingeführt. Damit können Sie den Verdauungszyklus explizit starten. Sie sollten dies jedoch nur verwenden, um einige Daten nach AngularJS zu migrieren (Integration mit anderen Frameworks). Verwenden Sie diese Methode jedoch niemals in Kombination mit regulärem AngularJS-Code, da AngularJS dann einen Fehler auslöst.
Wie hängt das alles mit dem DOM zusammen?
Nun, Sie sollten dem Tutorial wirklich noch einmal folgen, jetzt wo Sie das alles wissen. Der Digest-Zyklus stellt sicher, dass die Benutzeroberfläche und der JavaScript-Code synchron bleiben, indem jeder an alle $scope
s angehängte Watcher ausgewertet wird, solange sich nichts ändert. Wenn in der Digest-Schleife keine Änderungen mehr vorgenommen werden, gilt dies als abgeschlossen.
Sie können Objekte $scope
entweder explizit im Controller an das Objekt anhängen oder sie {{expression}}
direkt in der Ansicht in Form deklarieren .
Ich hoffe, das hilft, einige Grundkenntnisse über all dies zu klären.
Weitere Lesungen: