Beim Schreiben einer Angular-Direktive können Sie eine der folgenden Funktionen verwenden, um das DOM-Verhalten, den Inhalt und das Aussehen des Elements zu ändern, für das die Direktive deklariert ist:
- kompilieren
- Regler
- Pre-Link
- Post-Link
Es scheint einige Verwirrung darüber zu geben, welche Funktion man verwenden soll. Diese Frage umfasst:
Grundlagen der Richtlinie
- Wie deklariere ich die verschiedenen Funktionen?
- Was ist der Unterschied zwischen einer Quellvorlage und einer Instanzvorlage ?
- In welcher Reihenfolge werden die Direktivenfunktionen ausgeführt?
- Was passiert sonst noch zwischen diesen Funktionsaufrufen?
Funktion Natur, tun und nicht tun
Verwandte Fragen:
- Direktive: Link vs Compile vs Controller .
- Unterschied zwischen den Funktionen 'controller', 'link' und 'compile' beim Definieren einer angle.js-Direktive .
- Was ist der Unterschied zwischen der Kompilierung und Link - Funktion in AngularJS .
- Unterschied zwischen dem Pre-Compile- und dem Post-Compile-Element in AngularJS-Direktiven? .
- Angular JS-Richtlinie - Vorlage, Kompilierung oder Verknüpfung? .
- Post-Link vs Pre-Link in Angular js-Direktiven .
angularjs
angularjs-directive
Izhaki
quelle
quelle
Antworten:
In welcher Reihenfolge werden die Direktivenfunktionen ausgeführt?
Für eine einzige Richtlinie
Betrachten Sie basierend auf dem folgenden Plunk das folgende HTML-Markup:
Mit folgender Richtlinienerklärung:
Die Konsolenausgabe lautet:
Wir können sehen, dass
compile
das zuerst ausgeführt wird, danncontroller
, dannpre-link
und zuletztpost-link
.Für verschachtelte Anweisungen
Das ursprüngliche HTML-Markup besteht häufig aus verschachtelten Elementen mit jeweils einer eigenen Direktive. Wie im folgenden Markup (siehe Plunk ):
Die Konsolenausgabe sieht folgendermaßen aus:
Wir können hier zwei Phasen unterscheiden - die Kompilierungsphase und die Verknüpfungsphase .
Die Kompilierungsphase
Wenn das DOM geladen ist, startet Angular die Kompilierungsphase, in der es das Markup von oben nach unten durchläuft und
compile
alle Anweisungen aufruft . Grafisch könnten wir es so ausdrücken:Es ist vielleicht wichtig zu erwähnen, dass zu diesem Zeitpunkt die Vorlagen, die die Kompilierungsfunktion erhält, die Quellvorlagen sind (keine Instanzvorlage).
Die Verbindungsphase
DOM-Instanzen sind häufig einfach das Ergebnis einer Quellvorlage, die in das DOM gerendert wird. Sie können jedoch von erstellt
ng-repeat
oder im laufenden Betrieb eingeführt werden.Immer wenn eine neue Instanz eines Elements mit einer Direktive in das DOM gerendert wird, beginnt die Verknüpfungsphase.
In dieser Phase Angular Anrufe
controller
,pre-link
, iteriert Kinder und Anrufpost-link
auf allen Richtlinien, etwa so:quelle
Was passiert sonst noch zwischen diesen Funktionsaufrufen?
Die verschiedenen Direktivenfunktionen werden innerhalb von zwei anderen Winkelfunktionen ausgeführt, die aufgerufen werden
$compile
(wo die Direktivencompile
ausgeführt werden), und einer internen Funktion, die aufgerufen wirdnodeLinkFn
(wo die Direktiven ausgeführt werdencontroller
,preLink
undpostLink
ausgeführt werden). Innerhalb der Winkelfunktion passieren verschiedene Dinge, bevor und nachdem die Direktivenfunktionen aufgerufen werden. Am bemerkenswertesten ist vielleicht die Kinderrekursion. Die folgende vereinfachte Abbildung zeigt die wichtigsten Schritte in der Kompilierungs- und Verknüpfungsphase:Um diese Schritte zu demonstrieren, verwenden wir das folgende HTML-Markup:
Mit folgender Richtlinie:
Kompilieren
Die
compile
API sieht folgendermaßen aus:Oft wird den Parametern ein Präfix vorangestellt, um
t
zu kennzeichnen, dass die bereitgestellten Elemente und Attribute eher die der Quellvorlage als die der Instanz sind.Vor dem Aufruf von
compile
transkludiertem Inhalt (falls vorhanden) wird entfernt und die Vorlage auf das Markup angewendet. Das für diecompile
Funktion bereitgestellte Element sieht also folgendermaßen aus:Beachten Sie, dass der übertragene Inhalt zu diesem Zeitpunkt nicht erneut eingefügt wird.
Nach dem Aufruf der Direktive
.compile
durchläuft Angular alle untergeordneten Elemente, einschließlich derjenigen, die möglicherweise gerade von der Direktive eingeführt wurden (z. B. die Vorlagenelemente).Instanzerstellung
In unserem Fall werden drei Instanzen der obigen Quellvorlage (von
ng-repeat
) erstellt. Daher wird die folgende Sequenz dreimal pro Instanz ausgeführt.Regler
Die
controller
API beinhaltet:In der Verbindungsphase wird die über zurückgegebene Verbindungsfunktion
$compile
nun mit einem Bereich versehen.Zunächst erstellt die Verknüpfungsfunktion auf Anfrage einen untergeordneten Bereich (
scope: true
) oder einen isolierten Bereich (scope: {...}
).Der Controller wird dann ausgeführt und mit dem Bereich des Instanzelements versehen.
Pre-Link
Die
pre-link
API sieht folgendermaßen aus:Zwischen dem Aufruf der Direktive
.controller
und der.preLink
Funktion passiert praktisch nichts . Angular gibt weiterhin Empfehlungen, wie jedes verwendet werden sollte.Nach dem
.preLink
Aufruf durchläuft die Verknüpfungsfunktion jedes untergeordnete Element. Dabei wird die richtige Verknüpfungsfunktion aufgerufen und der aktuelle Bereich (der als übergeordneter Bereich für untergeordnete Elemente dient) angehängt.Post-Link
Die
post-link
API ähnelt der derpre-link
Funktion:Es ist vielleicht erwähnenswert, dass nach dem
.postLink
Aufruf der Funktion einer Direktive der Verknüpfungsprozess aller untergeordneten Elemente abgeschlossen ist, einschließlich aller untergeordneten.postLink
Funktionen.Dies bedeutet, dass zum Zeitpunkt des
.postLink
Anrufs die Kinder "leben" und bereit sind. Das beinhaltet:Die Vorlage in dieser Phase sieht also folgendermaßen aus:
quelle
Wie deklariere ich die verschiedenen Funktionen?
Kompilieren, Steuern, Pre-Link & Post-Link
Wenn alle vier Funktionen verwendet werden sollen, folgt die Direktive dieser Form:
Beachten Sie, dass beim Kompilieren ein Objekt zurückgegeben wird, das sowohl die Pre-Link- als auch die Post-Link-Funktion enthält. Im Angular-Jargon sagen wir, dass die Kompilierungsfunktion eine Vorlagenfunktion zurückgibt .
Kompilieren, Controller & Post-Link
Wenn dies
pre-link
nicht erforderlich ist, kann die Kompilierungsfunktion einfach die Post-Link-Funktion anstelle eines Definitionsobjekts zurückgeben, wie folgt:Manchmal möchte man eine
compile
Methode hinzufügen , nachdem die (Post-)link
Methode definiert wurde. Hierfür kann man verwenden:Controller & Post-Link
Wenn keine Kompilierungsfunktion benötigt wird, kann man die Deklaration insgesamt überspringen und die Post-Link-Funktion unter der
link
Eigenschaft des Konfigurationsobjekts der Direktive bereitstellen :Kein Controller
In jedem der obigen Beispiele kann die
controller
Funktion einfach entfernt werden, wenn sie nicht benötigt wird. Wenn zum Beispiel nur einepost-link
Funktion benötigt wird, kann man Folgendes verwenden:quelle
Was ist der Unterschied zwischen einer Quellvorlage und einer Instanzvorlage ?
Die Tatsache, dass Angular die DOM-Manipulation ermöglicht, bedeutet, dass sich das Eingabe-Markup für den Kompilierungsprozess manchmal von der Ausgabe unterscheidet. Insbesondere können einige Eingabemarkups einige Male (wie bei
ng-repeat
) geklont werden, bevor sie in das DOM gerendert werden.Die Winkelterminologie ist etwas inkonsistent, unterscheidet jedoch zwei Arten von Markups:
Das folgende Markup zeigt dies:
Die Quell-HTML definiert
welches als Quellvorlage dient.
Da diese Quellvorlage jedoch in eine
ng-repeat
Direktive eingeschlossen ist, wird sie geklont (in unserem Fall dreimal). Diese Klone sind Instanzvorlagen, die jeweils im DOM angezeigt werden und an den entsprechenden Bereich gebunden sind.quelle
Kompilierungsfunktion
Die
compile
Funktion jeder Direktive wird nur einmal aufgerufen, wenn Angular Bootstraps.Offiziell ist dies der Ort, an dem (Quell-) Vorlagenmanipulationen durchgeführt werden können, bei denen weder Umfang noch Datenbindung erforderlich sind.
Dies erfolgt hauptsächlich zu Optimierungszwecken. Beachten Sie das folgende Markup:
Die
<my-raw>
Direktive rendert einen bestimmten Satz von DOM-Markups. Also können wir entweder:ng-repeat
das Duplizieren der Quellvorlage (<my-raw>
) und ändern Sie dann das Markup jeder Instanzvorlage (außerhalb dercompile
Funktion).compile
Funktion) enthält, und lassen Sieng-repeat
es dann duplizieren.Wenn die
raws
Sammlung 1000 Elemente enthält , ist die letztere Option möglicherweise schneller als die erstere.Tun:
Unterlassen Sie
quelle
Controller-Funktion
Die
controller
Funktion jeder Direktive wird immer dann aufgerufen, wenn ein neues verwandtes Element instanziiert wird.Offiziell ist die
controller
Funktion, wo man:Auch hier ist zu beachten, dass, wenn die Direktive einen isolierten Bereich umfasst, alle darin enthaltenen Eigenschaften, die vom übergeordneten Bereich erben, noch nicht verfügbar sind.
Tun:
Unterlassen Sie:
quelle
Post-Link-Funktion
Wenn die
post-link
Funktion aufgerufen wird, haben alle vorherigen Schritte stattgefunden - Bindung, Transklusion usw.Dies ist normalerweise ein Ort, an dem das gerenderte DOM weiter bearbeitet werden kann.
Tun:
quelle
Pre-Link-Funktion
Die
pre-link
Funktion jeder Direktive wird immer dann aufgerufen, wenn ein neues verwandtes Element instanziiert wird.Wie bereits im Abschnitt zur Kompilierungsreihenfolge erwähnt, werden
pre-link
Funktionen als Eltern-dann-Kind bezeichnet, währendpost-link
Funktionen aufgerufen werdenchild-then-parent
.Die
pre-link
Funktion wird selten verwendet, kann jedoch in speziellen Szenarien hilfreich sein. Zum Beispiel, wenn sich ein untergeordneter Controller beim übergeordneten Controller registriert, die Registrierung jedoch auf eine Art undparent-then-child
Weise erfolgen muss (diesngModelController
geschieht auf diese Weise).Unterlassen Sie:
quelle