Ich muss einige Operationen am Bereich und an der Vorlage ausführen. Es scheint, dass ich das entweder in der link
Funktion oder in der controller
Funktion tun kann (da beide Zugriff auf den Bereich haben).
Wann ist es der Fall, wenn ich die link
Funktion und nicht den Controller verwenden muss?
angular.module('myApp').directive('abc', function($timeout) {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: true,
link: function(scope, elem, attr) { /* link function */ },
controller: function($scope, $element) { /* controller function */ }
};
}
Ich verstehe auch, dass dies link
die nicht eckige Welt ist. Also kann ich verwenden $watch
, $digest
und $apply
.
Welche Bedeutung hat die link
Funktion, als wir bereits einen Controller hatten?
javascript
angularjs
angularjs-directive
Yugal Jindle
quelle
quelle
$watch
,$digest
und$apply
. “?link
wir keine eckige Magie. dh keine 2-Wege-Bindungen usw. Nur dass wir die API des Winkels zur Verfügung haben.Antworten:
Nach meinem anfänglichen Kampf mit den
link
undcontroller
Funktionen und dem Lesen einer Menge darüber denke ich, dass ich jetzt die Antwort habe.Lassen Sie uns zuerst verstehen ,
Wie funktionieren Winkelanweisungen auf den Punkt gebracht:
Wir beginnen mit einer Vorlage (als Zeichenfolge oder in eine Zeichenfolge geladen)
var templateString = '<div my-directive>{{5 + 10}}</div>';
Dies
templateString
wird nun als eckiges Element gewickeltvar el = angular.element(templateString);
Mit
el
, jetzt kompilieren wir es mit$compile
, um die Link- Funktion zurück zu bekommen .var l = $compile(el)
Folgendes passiert:
$compile
geht die gesamte Vorlage durch und sammelt alle Anweisungen, die sie erkennt.link
Funktionen gesammelt.link
Funktionen in eine neuelink
Funktion eingeschlossen und als zurückgegebenl
.Schließlich stellen wir
scope
dieserl
(Link-) Funktion eine Funktion zur Verfügung , die die umschlossenen Link-Funktionen mit dieserscope
und ihren entsprechenden Elementen weiter ausführt .l(scope)
Dies fügt die
template
als neuen Knoten in demDOM
und ruftcontroller
die ihre Uhren zum fügt Umfang , die mit der Vorlage in DOM geteilt wird.Vergleich von compile vs link vs controller :
Jede Direktive wird nur einmal kompiliert und die Verknüpfungsfunktion bleibt zur Wiederverwendung erhalten. Wenn also etwas für alle Instanzen einer Direktive gilt, sollte dies innerhalb der
compile
Funktion der Direktive ausgeführt werden.Nach der Kompilierung haben wir nun eine
link
Funktion, die ausgeführt wird, während die Vorlage an das DOM angehängt wird . Deshalb führen wir alles aus, was für jede Instanz der Richtlinie spezifisch ist. Zum Beispiel: Anhängen von Ereignissen , Mutieren der Vorlage basierend auf dem Umfang usw.Schließlich soll der Controller verfügbar sein, um live und reaktiv zu sein, während die Direktive am
DOM
(nach dem Anhängen) arbeitet. Deshalb:(1) Nach dem Einrichten der Ansicht [ V ] (dh Vorlage) mit Link.
$scope
ist unser [ M ] und$controller
ist unser [ C ] in MVC(2) Nutzen Sie die 2-Wege- Bindung mit $ scope, indem Sie Uhren einrichten.
(3) Es
$scope
wird erwartet, dass Uhren in der Steuerung hinzugefügt werden, da dies die Vorlage zur Laufzeit überwacht.(4) Schließlich
controller
wird auch verwendet, um in der Lage zu sein, zwischen verwandten Richtlinien zu kommunizieren. (WiemyTabs
Beispiel in https://docs.angularjs.org/guide/directive )(5) Es ist wahr, dass wir all dies auch in der
link
Funktion hätten tun können, aber es geht um die Trennung von Bedenken .Daher haben wir endlich folgendes, das perfekt zu allen Teilen passt:
quelle
Warum Controller benötigt werden
Der Unterschied zwischen
link
undcontroller
kommt zum Tragen, wenn Sie Direktiven in Ihrem DOM verschachteln und API-Funktionen von der übergeordneten Direktive zu den verschachtelten verfügbar machen möchten.Aus den Dokumenten :
Angenommen, Sie möchten zwei Anweisungen haben
my-form
undmy-text-input
möchten, dass diemy-text-input
Anweisung nur innerhalbmy-form
und nirgendwo anders angezeigt wird.In diesem Fall sagen Sie beim Definieren der Direktive
my-text-input
, dass ein Controller aus demparent
DOM-Element erforderlich ist, indem Sie das Argument require wie folgt verwenden :require: '^myForm'
. Nun wird der Controller vom übergeordneten Element als viertes Argumentinjected
in dielink
Funktion aufgenommen$scope, element, attributes
. Sie können Funktionen auf diesem Controller aufrufen und mit der übergeordneten Direktive kommunizieren.Wenn ein solcher Controller nicht gefunden wird, wird außerdem ein Fehler ausgelöst.
Warum überhaupt Link verwenden
Es besteht keine wirkliche Notwendigkeit, die
link
Funktion zu verwenden, wenn man die definiert,controller
da die$scope
auf der verfügbar istcontroller
. Während man beidelink
und definiertcontroller
, muss man außerdem auf die Reihenfolge des Aufrufs der beiden achten (controller
wird vorher ausgeführt).In Übereinstimmung mit der Angular-Methode werden die meisten DOM-Manipulationen und 2-Wege-Bindungen
$watchers
normalerweise in derlink
Funktion ausgeführt, während die API für untergeordnete Elemente und die$scope
Manipulation in der Funktion ausgeführt werdencontroller
. Dies ist keine feste Regel, aber dies macht den Code modularer und hilft bei der Trennung von Bedenken (der Controller behält dendirective
Status bei und dielink
Funktion behält dieDOM
+ äußeren Bindungen bei).quelle
link
?controller
? Warum möchte ich eine ganz neue Funktion erfinden, um die Definition des Controllers zu vermeiden?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 aufModel
Änderungen reagieren müssen, die vonView
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 einercontroller/model/view
(Vorlage) überschreiten wollen .Beginnen wir mit den Parametern, die an die
link
Funktion übergeben werden: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 :
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
quelle
compiler
undlink
. Die Frage ist, warum,link
als wir bereits hattencontroller
controller
vslink
klarer sein ...link
oder zumcontroller
.controller
und binlink
relativ hässlich. Ein eckiges Team muss also einen guten Grund dafür haben, anstatt nur eine Option.