Wenn Sie eine Direktive erstellen, können Sie Code in den Compiler, die Link-Funktion oder den Controller einfügen.
In den Dokumenten erklären sie Folgendes:
- Kompilierungs- und Verknüpfungsfunktion werden in verschiedenen Phasen des Winkelzyklus verwendet
- Controller werden von Direktiven gemeinsam genutzt
Für mich ist jedoch nicht klar, welche Art von Code wohin gehen soll.
Beispiel: Kann ich beim Kompilieren Funktionen erstellen und diese an den Bereich im Link anhängen oder nur Funktionen an den Bereich im Controller anhängen?
Wie werden Controller von Direktiven gemeinsam genutzt, wenn jede Direktive einen eigenen Controller haben kann? Sind die Controller wirklich gemeinsam genutzt oder handelt es sich nur um die Scope-Eigenschaften?
angularjs
angularjs-directive
Schacki
quelle
quelle
Antworten:
Kompilieren:
In dieser Phase kompiliert Angular Ihre Direktive. Diese Kompilierungsfunktion wird nur einmal für jeden Verweis auf die angegebene Direktive aufgerufen. Angenommen, Sie verwenden die Anweisung ng-repeat. ng-repeat muss das angehängte Element nachschlagen, das angehängte HTML-Fragment extrahieren und eine Vorlagenfunktion erstellen.
Wenn Sie HandleBars, Unterstreichungsvorlagen oder Ähnliches verwendet haben, können Sie deren Vorlagen kompilieren, um eine Vorlagenfunktion zu extrahieren. An diese Vorlagenfunktion übergeben Sie Daten, und der Rückgabewert dieser Funktion ist der HTML-Code mit den Daten an den richtigen Stellen.
Die Kompilierungsphase ist der Schritt in Angular, der die Vorlagenfunktion zurückgibt. Diese Schablonenfunktion im Winkel wird als Verknüpfungsfunktion bezeichnet.
Verbindungsphase:
In der Verknüpfungsphase hängen Sie die Daten ($ scope) an die Verknüpfungsfunktion an und es sollte Ihnen das verknüpfte HTML zurückgegeben werden. Da die Direktive auch angibt, wohin dieses HTML geht oder was es ändert, ist es bereits gut zu gehen. Dies ist die Funktion, mit der Sie Änderungen an der verknüpften HTML-Datei vornehmen möchten, dh an der HTML-Datei, an die bereits die Daten angehängt sind. Wenn Sie im Winkel Code in die Verknüpfungsfunktion schreiben, ist dies im Allgemeinen die Post-Link-Funktion (standardmäßig). Es ist eine Art Rückruf, der aufgerufen wird, nachdem die Verknüpfungsfunktion die Daten mit der Vorlage verknüpft hat.
Controller:
Der Controller ist ein Ort, an dem Sie eine richtlinienspezifische Logik eingeben. Diese Logik kann auch in die Verknüpfungsfunktion einfließen, aber dann müssten Sie diese Logik in den Bereich einfügen, um sie "gemeinsam nutzbar" zu machen. Das Problem dabei ist, dass Sie dann den Gültigkeitsbereich mit Ihren Direktiven beschädigen würden, was nicht wirklich erwartet wird. Was ist also die Alternative, wenn zwei Richtlinien miteinander sprechen / zusammenarbeiten möchten? Natürlich können Sie all diese Logik in einen Dienst einfügen und dann beide Anweisungen von diesem Dienst abhängig machen, aber das bringt nur eine weitere Abhängigkeit mit sich. Die Alternative besteht darin, einen Controller für diesen Bereich bereitzustellen (normalerweise Bereich isolieren?), Und dann wird dieser Controller in eine andere Direktive eingefügt, wenn diese Direktive die andere "erfordert".
quelle
controller
wird nach der Kompilierung ausgeführt, jedoch zuvorpre-link
in einem lokalen DOM-Baumzweig. Auchcontroller
undpre-link
Funktionen werden ausgeführt , um die lokale DOM Niederlassung in einem Durchlaufen Top-down - Weise. Danachpost-link
wird von unten nach oben ausgeführt.controller
stattlink
überall verwenden? Damit ich den Code in Zukunft nicht mehr ändern muss, wenn die Methode gemeinsam genutzt oder eine Logik eingeführt werden muss? Gibt es Fallstricke bei der ständigen Verwendungcontroller
anstelle von Link?Ich wollte auch hinzufügen, was das O'Reily AngularJS-Buch des Google-Teams zu sagen hat:
quelle
Mit A
directive
können Sie das HTML-Vokabular deklarativ erweitern, um Webkomponenten zu erstellen. Dasng-app
Attribut ist eine Direktive, genaung-controller
wie alle anderenng- prefixed attributes
. Richtlinien können seinattributes
,tags
oder sogarclass
names
,comments
.Wie Direktiven geboren werden (
compilation
undinstantiation
)Kompilieren: Wir werden die
compile
Funktion sowohl fürmanipulate
das DOM verwenden, bevor es gerendert wird, als auch einelink
Funktion zurückgeben (die die Verknüpfung für uns übernimmt). Hier können auch alle Methoden platziert werden, die mit alleninstances
Richtlinien dieser Richtlinie geteilt werden müssen.link: Mit dieser
link
Funktion registrieren wir alle Listener für ein bestimmtes DOM-Element (das aus der Vorlage geklont wurde) und richten unsere Bindungen für die Seite ein.Wenn sie in der
Objekt gebunden wird.
compile()
Funktion eingestellt wären, wären sie nur einmal eingestellt worden (was oft das ist, was Sie wollen). Wenn sie in derlink()
Funktion festgelegt sind, werden sie jedes Mal festgelegt, wenn das HTML-Element an Daten imCompile
Funktion gibt diepre
undpost
Link-Funktion zurück. In der Pre-Link-Funktion haben wir die Instanzvorlage und auch den Bereich aus demcontroller
, aber die Vorlage ist nicht an den Bereich gebunden und hat noch keinen transkludierten Inhalt.Post
Bei der Link-Funktion ist die Post-Link-Funktion die letzte auszuführende Funktion. Jetzttransclusion
ist das abgeschlossenthe template is linked to a scope
und dasview will update with data bound values after the next digest cycle
. Dielink
Option ist nur eine Verknüpfung zum Einrichten einerpost-link
Funktion.Regler: Der Direktivencontroller kann an eine andere Direktivenverknüpfungs- / Kompilierungsphase übergeben werden. Es kann in andere Direktiven eingefügt werden, um es in der Kommunikation zwischen Direktiven zu verwenden.
Sie müssen den Namen der erforderlichen Anweisung angeben. Sie sollte an dasselbe Element oder dessen übergeordnetes Element gebunden sein. Dem Namen kann Folgendes vorangestellt werden:
Verwenden Sie eine eckige Klammer,
[‘directive1′, ‘directive2′, ‘directive3′]
um einen Controller mit mehreren Anweisungen zu benötigen.quelle
Ein guter Grund für die Verwendung einer Controller- / Link-Funktion (da beide Zugriff auf den Bereich, das Element und die Attribute haben) ist, dass Sie jeden verfügbaren Dienst oder jede verfügbare Abhängigkeit an einen Controller (und in beliebiger Reihenfolge) übergeben können Mit der Link-Funktion können Sie das nicht tun. Beachten Sie die unterschiedlichen Signaturen:
vs.
quelle
module.directive('myDirective', function($window) { etc...
. Darauf kann dann über die Link-Funktion zugegriffen werden.Dies ist ein gutes Beispiel für das Verständnis der Richtlinienphasen http://codepen.io/anon/pen/oXMdBQ?editors=101
html
quelle
link
,compile
undcontroller
?require
d-Direktive in den Controller einer abhängigen Direktive eingefügt werden kann?quelle