AngularJS: Gibt es einen Unterschied zwischen $ transclude local im Direktiven-Controller und transclude Parameter in der Link-Funktion?

8

Ich habe eine Direktive implementiert, die mehrere Fragmente von Kind-Inhalten in eine Vorlage umwandelt. Es funktioniert, scheint aber einfacher als die meisten der Beispiele, die ich gesehen habe, und warf ein paar Fragen auf, wie Transclusion funktioniert.

Hier ist die Richtlinie:

%Vor%

und hier ist Beispiel Verwendung:

%Vor%

Sie können es in Aktion in dieser Geige sehen.

Bitte beachten Sie ein paar Dinge:

  1. Es passt Fragmente zu Vorlagenplatzhaltern nach Elementklasse und nicht nach explizit definierten untergeordneten Anweisungen. Gibt es einen Grund, dies auf die eine oder andere Weise zu tun?
  2. Im Gegensatz zu vielen Beispielen, die ich gesehen habe, verwendet es nicht explizit den $ compile-Dienst für die Kindfragmente. Es scheint so, als ob Angular die Fragmente nach der Transkription kompiliert, zumindest in diesem einfachen Fall. Ist das immer richtig?
  3. Es verwendet das (kaum dokumentierte) transclude-Argument für die Link-Funktion und nicht den anderen (kaum dokumentierten) Ansatz, das $ transclude local in die Controller-Direktive zu injizieren. Nachdem er so viele Ermahnungen gehört hat, DOM in Controllern nicht zu manipulieren, erscheint der Controller-Ansatz wie ein seltsames Konstrukt und es fühlt sich natürlicher an, dies in der Link-Funktion zu handhaben. Wie auch immer, ich habe es so versucht und es scheint genauso zu funktionieren. Gibt es einen Unterschied zwischen den beiden?

Danke.

BEARBEITEN: Um Frage # 2 teilweise zu beantworten, habe ich festgestellt, dass Sie explizit übersetzten Inhalt kompilieren müssen, der nicht aus der Vorlage geklont wurde, auf die die Anweisung angewendet wurde. Sehen Sie den Unterschied im Verhalten hier: Ссылка

    
karlgold 22.03.2014, 22:16
quelle

2 Antworten

2

Um Ihre Frage zu den Unterschieden zwischen $ transclude-Funktion in der Funktion controller vs. linking zu beantworten, müssen wir zuerst verstehen, dass $ transclude-Funktion über Direktive aufgerufen werden kann Kompilieren , Controller und Verknüpfen Funktionen.

AKTUALISIEREN : Laut der 1.4 Angular-Dokumentation wurde kompilieren (transclude) veraltet ! Die transclude-Funktion kann also nur in der directive Controller - oder Linking -Funktion aufgerufen werden. (Siehe offizielle Dokumentation für Detailerklärung )

Es gibt einen großen Unterschied, wenn $ transclude in der compile -Phase und $ transclude in controller und linking -Phase aufgrund der Compilierungsphase verwendet wird , Sie haben keinen Zugriff auf $ scope vs. in controller und linking Funktionen, in denen $ scope (controller) und scope (linking) verfügbar sind. Der einzige Unterschied bei der Verwendung von $ transclude in directive controller vs. linking ist Reihenfolge der Ausführung . Bei mehreren verschachtelten Direktiven ist es relativ sicher, $ transclude während der Verknüpfungsphase zu verwenden, anstatt es in Ihrem Controller zu verwenden.

Die Reihenfolge lautet wie folgt:

  1. parentDirectiveCompile - & gt; childDirectiveCompile (Kompilierung der Richtlinie)

  2. parentDirectiveControllerPre, parentDirectiveControllerPost - & gt; childDirectiveControllerPre, childDirectiveControllerPost (Richtliniencontroller)

  3. childLinkFunction - & gt; parentLinkFunction

Beachten Sie, wie childLinkFunction zuerst vor parentLinkFunction ausgeführt wird? (Reihenfolge der Ausführung)

Hilfreiche Ressource :

Hoffentlich kann diese Antwort für Sie hilfreich sein!

    
JayKan 19.02.2015, 18:11
quelle
0

nach einer Untersuchung:

Nach der Freigabe von Angular 1.20 erben bereits vorhandene untergeordnete Knoten einer kompilierten Direktive mit einem isolieren Bereich nicht mehr den neuen isolierten Bereich, da sie bereits dem übergeordneten Bereich zugewiesen wurden. Also ... die eingebaute transclude-Methode, die das Attribut ng-transclude verwendet, wird in diesem Fall nur Templates an den gewünschten Ort transponieren, aber nicht bereits existierendes HTML an diesen Ort übertragen. Dies bedeutet, dass wenn Sie eine Direktive mit einem isolate-Bereich hätten und Sie möchten, dass das bereits vorhandene html in den neuen isolate-Bereich kompiliert wird, müssen Sie die linker-Funktion transclude innerhalb der Direktive verwenden.

Sie können hier einen Arbeitsfall dieses Problems sehen ui-codemirror, der in benutzerdefinierte Anweisungen eingefügt wurde, schlägt ohne Fehler fehl

    
btm1 01.04.2014 17:35
quelle