Angular Direktiven - Wann und wie verwende ich kompilieren, controller, pre-link und post-link
Beim schreiben einer Angular Direktive, kann man verwenden, um die folgenden Funktionen zur Manipulation der DOM-Verhalten, die Inhalte und das Aussehen des Elements, auf dem der Richtlinie wird erklärt:
- kompilieren
- controller
- pre-link
- post-link
Scheint es einige Verwirrung, als für die Funktion sollte man nutzen. Diese Frage erfasst:
Richtlinie Grundlagen
- Wie erklären die verschiedenen Funktionen?
- Was ist der Unterschied zwischen einer Quelle Vorlage und - Instanz-Vorlage?
- In welcher Reihenfolge die Richtlinie Funktionen ausgeführt werden?
- Was passiert zwischen diese Funktion Aufrufe?
Funktion der Natur, do 's und dont' s
Fragen:
- Richtlinie: link vs kompilieren vs controller.
- Unterschied zwischen der 'controller', 'link' und 'kompilieren' - Funktionen bei der Definition von angular.js Richtlinie.
- Was ist der Unterschied zwischen compile-und link-Funktion in angularjs.
- Unterschied zwischen Prä-kompilieren und post-compile-element in AngularJS Direktiven?.
- Angular JS-Richtlinie - Vorlage, compile oder link?.
- link post vs pre-link in Angular js Direktiven.
InformationsquelleAutor der Frage Izhaki | 2014-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
In welcher Reihenfolge die Richtlinie Funktionen ausgeführt werden?
Für eine einzelne Richtlinie
Basiert auf den folgenden plunkbetrachten Sie das folgende HTML-markup:
Mit der folgenden Richtlinie Erklärung:
Der Konsole ausgegeben werden:
Können wir sehen, dass
compile
wird zuerst ausgeführt, danncontroller
dannpre-link
und Letzte istpost-link
.Für verschachtelte Richtlinien
Des original-HTML-markup ist Häufig von verschachtelten Elementen, jedes mit seiner eigenen Richtlinie. Wie im folgenden markup (siehe plunk):
Die Ausgabe der Konsole sieht wie folgt aus:
Unterscheiden wir zwei Phasen hier - die kompilieren phase und die link phase.
Die compile-phase
Wenn das DOM geladen ist Eckig startet die compile-phase, wo es durchquert das markup von oben nach unten und ruft
compile
auf alle Richtlinien. Grafisch könnten wir es Ausdrücken, etwa so:Ist es vielleicht wichtig zu erwähnen, dass in dieser Phase, die Vorlagen, die der compile-Funktion wird die Quelle der Vorlagen (nicht-Instanz-Vorlage).
Der link-phase
DOM-Instanzen sind oft nur das Ergebnis von einem Quell-Vorlage gerendert wird, um den DOM, aber Sie können erstellt werden, indem
ng-repeat
oder eingeführt on-the-fly.Immer, wenn eine neue Instanz eines Elements mit einer Richtlinie dargestellt, um den DOM, die link-phase beginnt.
In dieser phase, Winkel-Anrufe
controller
pre-link
iteriert die Kinder, und rufen Siepost-link
auf alle Richtlinien, etwa so:InformationsquelleAutor der Antwort Izhaki
Was passiert zwischen diese Funktion Aufrufe?
Die Richtlinie verschiedene Funktionen ausgeführt werden, innerhalb von zwei andere Winkel-Funktionen genannt
$compile
(wo die Richtliniecompile
ausgeführt wird) und eine interne Funktion namensnodeLinkFn
(wo die Richtliniecontroller
preLink
undpostLink
ausgeführt werden). Verschiedene Sachen in den eckigen Funktion vor und nach der Richtlinie Funktionen aufgerufen werden. Vielleicht am bemerkenswertesten ist das Kind Rekursion. Die folgende vereinfachte Abbildung zeigt die wesentlichen Schritte innerhalb der compile-und link-Phasen:Demonstrieren die folgenden Schritte, verwenden wir Folgendes HTML-markup:
Mit der folgenden Richtlinie:
Kompilieren
Den
compile
API sieht so aus:Oft die Parameter vorangestellt
t
zu bedeuten, dass die Elemente und Attribute zur Verfügung gestellt werden, denen der source-Vorlage, anstatt, dass die Instanz.Vor dem Aufruf von
compile
transcluded Inhalt (falls vorhanden) wird entfernt, und die Vorlage wird angewendet, um das markup. So, das element zur Verfügung gestellt, um diecompile
Funktion wird ungefähr so Aussehen:Beachten Sie, dass die transcluded Inhalt ist nicht neu eingefügt an dieser Stelle.
Folgenden der Aufruf an die Richtlinie
.compile
-, Winkel Durchlaufen alle child-Elemente, einschließlich derer, die gerade erst eingeführt wurden, die durch die Richtlinie (die template-Elemente, zum Beispiel).Instanz Erstellung
In unserem Fall, drei Instanzen der Quelle obigen template erstellt werden (durch
ng-repeat
). So in der folgenden Sequenz wird dreimal ausgeführt, einmal pro Instanz.Controller
Den
controller
API beinhaltet:Eingabe der link-phase der link-Funktion zurückgegeben, die über
$compile
ist jetzt mit Umfang.Ersten, die link-Funktion erstellen Sie einen untergeordneten Bereich (
scope: true
) oder einem isolierten Bereich (scope: {...}
), wenn angefordert.Den controller dann ausgeführt wird, sofern der Umfang der Instanz-element.
Pre-link
Den
pre-link
API sieht so aus:Praktisch nichts passiert zwischen dem Aufruf der Richtlinie
.controller
und die.preLink
Funktion. Winkel-noch eine Empfehlung, wie jedes verwendet werden sollte.Folgenden die
.preLink
rufen Sie die link-Funktion Durchlaufen jedes child-element - Aufruf der korrekte link-Funktion und Befestigung, um es den aktuellen Bereich (die dient dem übergeordneten Bereich für child-Elemente).Post-link
Den
post-link
API ist ähnlich wie diepre-link
Funktion:Vielleicht lohnt sich zu bemerken, dass, sobald eine Richtlinie
.postLink
Funktion aufgerufen wird, die link-Prozess von allen seinen untergeordneten Elementen abgeschlossen hat, einschließlich aller Kinder.postLink
Funktionen.Dies bedeutet, dass durch die Zeit, die
.postLink
heißt, die Kinder sind 'live' sind bereit. Dies beinhaltet:Die Vorlage in dieser Phase wird also ungefähr so Aussehen:
InformationsquelleAutor der Antwort Izhaki
Wie erklären die verschiedenen Funktionen?
Kompilieren, Controller, Pre-link - & Post-link
Wenn man alle vier Funktion, die die Richtlinie befolgen Sie diese form:
Beachten Sie, dass kompilieren gibt ein Objekt zurück, die sowohl die pre-link-und post-link-Funktionen; Winkel-lingo-sagen wir die compile-Funktion gibt einen template-Funktion.
Kompilieren, Controller & Post-link
Wenn
pre-link
ist nicht notwendig, die compile-Funktion kann einfach den post-link-Funktion statt einer definition Objekt, etwa so:Manchmal möchte man hinzufügen
compile
Methode, nach der (post -)link
- Methode definiert wurde. Für diese kann man verwenden:Controller & Post-link
Wenn keine compile-Funktion benötigt wird, kann man überspringen, seine Erklärung insgesamt und den post-link-Funktion unter der
link
Eigenschaft der Richtlinie configuration-Objekt:Kein controller
In jedem der obigen Beispiele kann man einfach entfernen Sie die
controller
Funktion, wenn nicht benötigt. So zum Beispiel, wenn nurpost-link
- Funktion benötigt wird, kann man verwenden:InformationsquelleAutor der Antwort Izhaki
Was ist der Unterschied zwischen einem Quelle Vorlage und ein Instanz-Vorlage?
Die Tatsache, dass Angular ermöglicht DOM-manipulation bedeutet, dass der Eingang markup in die Kompilierung ist manchmal Verschieden von der Ausgabe. Besonders, einige input-markup kann geklont werden, ein paar mal (wie mit
ng-repeat
), bevor gerendert wird, um das DOM.Winkel-Terminologie ist ein bisschen widersprüchlich, aber es immer noch unterscheidet zwischen zwei Arten von Markierungen:
Das folgende markup veranschaulicht dies:
Die html-Quelle definiert
dient als Quelle Vorlage.
Aber so wie es gewickelt ist, innerhalb einer
ng-repeat
Richtlinie, diese Quelle Vorlage geklont wird (3 mal in unserem Fall). Diese Klone sind Instanz-Vorlage, jedes erscheinen in der DOM-und gebunden an die jeweiligen Anwendungsbereich.InformationsquelleAutor der Antwort Izhaki
Compile-Funktion
Jede Richtlinie
compile
Funktion wird nur einmal aufgerufen, wenn die Winkel-bootstraps.Offiziell, dies ist der Ort, zu erfüllen (Quelle) Vorlage Manipulationen, die nicht mit Umfang oder data binding.
Dadurch soll in Erster Linie für die Optimierung Zwecke; betrachten Sie das folgende markup:
Den
<my-raw>
Richtlinie machen wird, einen bestimmten Satz von DOM-markup. So können wir entweder:ng-repeat
zum duplizieren der Quelle Vorlage (<my-raw>
), und ändern Sie dann den Wert von jeder Instanz-Vorlage (außerhalb dercompile
- Funktion).compile
- Funktion), und dann lassen Sieng-repeat
zu duplizieren.Wenn es 1000 Elemente in der
raws
Sammlung, die letztere option können Sie schneller als die vorigen.Tun:
Nicht
InformationsquelleAutor der Antwort Izhaki
Post-link-Funktion
Wenn die
post-link
Funktion aufgerufen wird, werden alle vorherigen Schritte haben stattgefunden - Bindung, transklusion, etc.Dies ist normalerweise ein Ort, um weiter zu manipulieren die gerenderten DOM.
Tun:
InformationsquelleAutor der Antwort Izhaki
Controller-Funktion
Jede Richtlinie
controller
Funktion wird immer aufgerufen, wenn eine neue Verwandte element instanziiert wird.Offiziell, die
controller
Funktion ist, wo man:Wieder, es ist wichtig, daran zu erinnern, dass, wenn die Richtlinie handelt es sich um einen isolierten Anwendungsbereich, Eigenschaften, die Vererbung von der übergeordneten Bereich sind noch nicht verfügbar.
Tun:
Nicht:
InformationsquelleAutor der Antwort Izhaki
Pre-link-Funktion
Jede Richtlinie
pre-link
Funktion wird immer aufgerufen, wenn eine neue Verwandte element instanziiert wird.Wie bereits gesehen in der Reihenfolge der Kompilierung Abschnitt
pre-link
Funktionen aufgerufen werden Eltern-dann-Kind, in der Erwägung, dasspost-link
Funktionen aufgerufen werdenchild-then-parent
.Den
pre-link
Funktion wird nur selten verwendet, kann aber sinnvoll sein, in speziellen Szenarien; zum Beispiel, wenn ein Kind controller registriert sich selbst mit der parent-controller, aber die Registrierung hat in einemparent-then-child
Mode (ngModelController
tut Dinge auf diese Weise).Nicht:
InformationsquelleAutor der Antwort Izhaki