Die controller
Funktion / das Objekt repräsentiert einen Abstraktionsmodell-View-Controller (MVC). Es gibt zwar nichts Neues über MVC zu schreiben, aber es ist immer noch der bedeutendste Vorteil von Angular: Teilen Sie die Bedenken in kleinere Teile auf. Und das ist es, nichts weiter. Wenn Sie also auf Model
Änderungen reagieren müssen, die von View
der kommen, Controller
ist die richtige Person , um diesen Job zu erledigen.
Die Geschichte über die link
Funktion ist anders, sie kommt aus einer anderen Perspektive als MVC. Und ist wirklich wichtig, wenn wir die Grenzen einer controller/model/view
(Vorlage) überschreiten wollen .
Beginnen wir mit den Parametern, die an die link
Funktion übergeben werden:
function link(scope, element, attrs) {
- scope ist ein Angular-Scope-Objekt.
- element ist das von jqLite umschlossene Element, mit dem diese Direktive übereinstimmt.
- attrs ist ein Objekt mit den normalisierten Attributnamen und den entsprechenden Werten.
Um dies link
in den Kontext zu stellen, sollten wir erwähnen, dass alle Anweisungen diese Initialisierungsprozessschritte durchlaufen: Kompilieren , Verknüpfen . Ein Auszug aus Brad Green und Shyam Seshadri Buch Angular JS :
Kompilierungsphase (eine Schwester von Link, lassen Sie es uns hier erwähnen, um ein klares Bild zu erhalten):
In dieser Phase durchläuft Angular das DOM, um alle registrierten Anweisungen in der Vorlage zu identifizieren. Für jede Direktive transformiert es dann das DOM basierend auf den Regeln der Direktive (Vorlage, Ersetzen, Transkludieren usw.) und ruft die Kompilierungsfunktion auf, falls vorhanden. Das Ergebnis ist eine kompilierte Vorlagenfunktion.
Verbindungsphase :
Um die Ansicht dynamisch zu gestalten, führt Angular dann für jede Direktive eine Verknüpfungsfunktion aus. Die Verknüpfungsfunktionen erstellen normalerweise Listener im DOM oder im Modell. Diese Listener halten die Ansicht und das Modell jederzeit synchron.
Ein schönes Beispiel für die Verwendung von link
finden Sie hier: Erstellen von benutzerdefinierten Anweisungen . Siehe Beispiel: Erstellen einer Direktive zum Manipulieren des DOM , bei der eine "Datum-Uhrzeit" in die Seite eingefügt wird, die jede Sekunde aktualisiert wird.
Nur ein sehr kurzer Ausschnitt aus dieser reichhaltigen Quelle oben, der die wahre Manipulation mit DOM zeigt. Der $ timeout-Dienst verfügt über eine Hook-Funktion und wird in seinem Destruktoraufruf gelöscht , um Speicherlecks zu vermeiden
.directive('myCurrentTime', function($timeout, dateFilter) {
function link(scope, element, attrs) {
...
// the not MVC job must be done
function updateTime() {
element.text(dateFilter(new Date(), format)); // here we are manipulating the DOM
}
function scheduleUpdate() {
// save the timeoutId for canceling
timeoutId = $timeout(function() {
updateTime(); // update DOM
scheduleUpdate(); // schedule the next update
}, 1000);
}
element.on('$destroy', function() {
$timeout.cancel(timeoutId);
});
...
$watch
,$digest
und$apply
. “?