Was passiert sonst noch zwischen diesen Funktionsaufrufen?
Die verschiedenen Direktivenfunktionen werden innerhalb von zwei anderen Winkelfunktionen ausgeführt, die aufgerufen werden $compile
(wo die Direktiven compile
ausgeführt werden), und einer internen Funktion, die aufgerufen wird nodeLinkFn
(wo die Direktiven ausgeführt werden controller
, preLink
und postLink
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:
<div ng-repeat="i in [0,1,2]">
<my-element>
<div>Inner content</div>
</my-element>
</div>
Mit folgender Richtlinie:
myApp.directive( 'myElement', function() {
return {
restrict: 'EA',
transclude: true,
template: '<div>{{label}}<div ng-transclude></div></div>'
}
});
Kompilieren
Die compile
API sieht folgendermaßen aus:
compile: function compile( tElement, tAttributes ) { ... }
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 die compile
Funktion bereitgestellte Element sieht also folgendermaßen aus:
<my-element>
<div>
"{{label}}"
<div ng-transclude></div>
</div>
</my-element>
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:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
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:
function preLink( scope, element, attributes, controller ) { ... }
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 der pre-link
Funktion:
function postLink( scope, element, attributes, controller ) { ... }
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:
- Datenbindung
- Transklusion angewendet
- Umfang beigefügt
Die Vorlage in dieser Phase sieht also folgendermaßen aus:
<my-element>
<div class="ng-binding">
"{{label}}"
<div ng-transclude>
<div class="ng-scope">Inner content</div>
</div>
</div>
</my-element>