Angenommen, ich habe zwei Attribut-Anweisungen namens myFoo
und myBar
. Diese Direktiven sind mit restrict: 'A'
definiert.
Dann habe ich ein Element
%Vor% In welcher Reihenfolge würden die Kompilierungs- / Verknüpfungsfunktionen aufgerufen werden? Wird my-foo
immer vor dem Kompilieren von my-bar
kompiliert?
Zusätzlich zu @ valepus Antwort hier ist die Beschreibung für die Eigenschaft priority
für das DDO (Directive Definition Object):
TL; DR Der Standardwert priority
ist 0
. Wenn Sie die Reihenfolge ändern möchten, in der Elemente kompiliert werden, müssen Sie priority
für das Element (s ).
Wenn für ein einzelnes DOM-Element mehrere Direktiven definiert sind, Manchmal ist es notwendig, die Reihenfolge der Richtlinien anzugeben werden angewendet. Die Priorität wird verwendet, um die Direktiven vor ihren zu sortieren Kompilierfunktionen werden aufgerufen. Priorität ist als Nummer definiert. Richtlinien mit höherer numerischer Priorität werden zuerst kompiliert. Pre-Link-Funktionen werden auch in der Reihenfolge der Priorität ausgeführt, aber nach dem Link Funktionen werden in umgekehrter Reihenfolge ausgeführt. Die Reihenfolge der Richtlinien mit dem dieselbe Priorität ist undefiniert. Die Standardpriorität ist 0.
Wenn Sie in Ihrem Fall nicht priority
für Ihre Anweisungen angeben, wird my-bar
zuerst kompiliert, gefolgt von my-foo
. Beachten Sie jedoch, dass der Controller zuerst initialisiert wird, dann der pre
gefolgt von der post
link-Funktion. Auch hier ist die Reihenfolge wichtig: Angular setzt die Anweisungen abwechselnd zusammen. Das Folgende ist mein console.log
Drucken, das den Prozess zeigt:
Wenn Sie gerne spielen möchten, habe ich einen Plunker eingerichtet.
Wenn Sie jetzt priority
in priority: 1
ändern, erhalten Sie folgende Ausgabe:
Wie Sie sehen, beginnt es mit myFoo
und geht weiter mit myBar
. So hat myFoo
jetzt eine höhere Priorität.
Update 1
Frage:
Wie gehen Sie mit einer Sitation um, bei der zwei verschiedene Herstellerrichtlinien (A und B) voneinander abhängen und die Reihenfolge der Ausführung wichtig ist? Ist es möglich, ohne die vedor Einstellungen zu ändern?
Ich würde vorschlagen, einen Dekorator wie folgt zu implementieren:
%Vor% Normalerweise fängt ein Dekorator die Erstellung eines Dienstes ab, wodurch er das Verhalten eines Dienstes überschreiben oder ändern kann. Sie können Ihre Anweisung jedoch auch wie oben dargestellt dekorieren. Im Decorator können Sie die Priorität auf Ihre Bedürfnisse festlegen, um die Reihenfolge der Ausführung zu bewirken. Soweit ich weiß, ist die Eigenschaft priority
die einzige Möglichkeit, die Reihenfolge zu steuern, in der die Anweisungen angewendet werden. Wenn Sie einen Decorator verwenden, ändern / überschreiben Sie die Eigenschaft priority
, aber nicht direkt deren Einstellungen, falls Sie nicht DDO meinen.
Der Plunker oben wird ebenfalls mit der Decorator-Implementierung aktualisiert.
Nein, Direktiven haben ein Feld namens "priority", das angular angibt, wann sie kompiliert werden müssen. Je größer die Priorität, desto früher werden sie zusammengestellt. In Ihrem Fall werden die Direktiven immer in der gleichen Reihenfolge kompiliert (egal wie Sie sie in das Tag schreiben) und diese Reihenfolge hängt von ihrem Prioritätsfeld ab (Standard ist 0).
von Ссылка
%Vor%Priorität
Wenn für ein einzelnes DOM-Element mehrere Direktiven definiert sind, Manchmal ist es notwendig, die Reihenfolge der Richtlinien anzugeben werden angewendet. Die Priorität wird verwendet, um die Direktiven vor ihren zu sortieren Kompilierfunktionen werden aufgerufen. Priorität ist als Nummer definiert. Richtlinien mit höherer numerischer Priorität werden zuerst kompiliert. Pre-Link-Funktionen werden auch in der Reihenfolge der Priorität ausgeführt, aber nach dem Link Funktionen werden in umgekehrter Reihenfolge ausgeführt. Die Reihenfolge der Richtlinien mit dem dieselbe Priorität ist undefiniert. Die Standardpriorität ist 0.
Dieser Artikel scheint recht gut zu erklären, wie die Priorität in verschiedenen Fällen funktioniert: Ссылка
Tags und Links javascript angularjs