2014-02-26 5 views
5

Während ng-include für meine Bedürfnisse Umschreiben, fand ich, dass die direcive ngIncludeFillContentDirective, die als ng-include wie deklariert wird:Was ist der Zweck, die gleiche Direktive zweimal in Angular zu deklarieren?

.directive({ngInclude: ngIncludeDirective}).directive({ngInclude: ngIncludeFillContentDirective})

Sie die ngInclude source here sehen können. Und Sie können sehen, die Direktive-Methode wie oben genannt here aufgerufen wird.

Also, was genau ist der Effekt auf die aktuelle Richtlinie? Wird es nur als eine andere Richtlinie angewendet? Hat es eine besondere Bedeutung?

Antwort

1

Sie second link zeigt die Kompilierung der Kern-Winkel-Direktiven. Die .directive Funktion der Kompilierungsprovider ist mit $provide.provider('$compile', $CompileProvider).

erstellt Ihr erster Link zeigt die Deklaration ngInclude und ngIncludeFillContentDirective. Sie können sehen, dass ngIncludeFillContentDirective auf ngInclude abhängt.

Ich bin mir ziemlich sicher, dass während der Kompilierung ngInclude zuerst kompiliert werden muss, bevor ngIncludeFillContentDirective kompiliert wird.

Also ich glaube, das ist mit .directive verkettet, um den Kompilierungsvorgang zu bestellen und die Abhängigkeiten in der richtigen Reihenfolge aufzubauen.

EDIT:
So here is the current source für $CompileProvider. Es gibt eine Funktion für dieses Objekt mit dem Namen directive. Dies ist die Funktion, die im OP aufgerufen wird.

können Sie sehen, dass, wenn der Parameter nicht eine Zeichenkette, die es nennt diese Linie auf dem Parameter-Objekt ist:

forEach(name, reverseParams(registerDirective)); 

Dies resultiert im Wesentlichen verwendet forEach die Eigenschaften des Parameter-Objekts iterieren. forEach zieht den Schlüssel aus dem Objekt und dann tut dies:

iterator.call(context, obj[key], key); 

Also, es wird nur den Wert des Schlüssels.

Ich denke, was darauf hinausläuft, ist, dass der Name der Eigenschaft im Objekt (So, ngInclude in {ngInclude: ngIncludeFillContentDirective}) muss nur eindeutig sein. Der Wert der Eigenschaft (ngIncludeFillContentDirective) ist, was registriert ist.

Es scheint also keine besondere Bedeutung zu geben. Zumindest keine die ich finden kann.

+0

Richtig, aber es ist mit dem gleichen Namen deklariert. Wenn Sie also ein "ng-include" -Element erstellen würden, würden beide Direktiven aufgerufen. – Zequez

+0

@Zequez Ich habe die Antwort nach ein bisschen mehr Untersuchung bearbeitet. –

3

Sie können den gleichen Namen für mehrere Direktiven verwenden, und alle werden ausgeführt, wenn Sie den Quellcode für ngInclude ngInclude.js betrachten, werden Sie sehen, dass jede Direktive Prioritätsattribut hat. Der erste ist 400 und der letzte ist -400. Priorität ist eigentlich die Reihenfolge, in der die gleichnamigen Anweisungen, aber unterschiedliche Prioritäten ausgeführt werden.

Sie können Ihre Anweisung sogar aus irgendeinem Grund anhängen, aber fügen Sie die niedrigere Priorität hinzu, um sicherzustellen, dass sie die erforderlichen Werte liefert. Es ist jedoch nicht ratsam, native ng-Anweisungen zu überschreiben.

Verwandte Themen