AngularJs: Übergeben von Funktionsargumenten über mehrere isolierte Bereiche mit Winkelrichtlinien

7

Ich habe 3 verschachtelte, isolieren Bereich, Richtlinien ( CodePen hier sehen ) und ich kann Übergeben Sie eine Funktion (die ein Argument benötigt) von der äußersten Direktive an die innerste Direktive (die Funktion von der äußeren Direktive an die intermediate Direktive an die innere Direktive übergeben).

Was ich nicht verstehe, ist, was getan werden muss, um das Argument von der inneren Richtlinie zurück durch die Zwischenrichtlinie zurück zur äußeren Richtlinie zu bringen.

Siehe auch das CodePen-Beispiel .

Hinweis: Wenn ich nur 2 isolate scope-Direktiven angegeben habe, kann ich das mit etwas ähnlichem wie dem folgenden anfangen ...

%Vor%

Der obige Code gibt mir eine Alarmbox mit 'Henry' (genau wie ich es erwarte).

Wenn ich eine dritte, intermediate isolate scope-Direktive hinzufüge, kommt es zu Problemen ...

%Vor%

Dieser Code gibt mir eine Warnung mit undefined ...

    
sfletche 21.04.2015, 04:29
quelle

4 Antworten

17

Ein weit verbreitetes Missverständnis ist, dass "& ist für die Weitergabe von Funktionen". Dies ist technisch nicht korrekt.

Was & tut, ist eine Funktion für den Direktivenbereich, die beim Aufruf das Ergebnis des ausgewerteten Ausdrucks für den übergeordneten Bereich zurückgibt.

Diese Funktion nimmt ein Objekt als Argument, das lokale Variablen im Ausdruck mit denen aus dem Bereich der Direktiven (das Objekt {name: testName} ) in diesem Fall überschreibt.

Wenn Sie unter die Haube schauen würden, würde die Methode $scope.addName in myDir2 so aussehen (vereinfacht):

%Vor%

Ihre zweite Anweisung funktioniert, weil der Ausdruck, an den sie gebunden ist,

ist %Vor%

Dieser Ausdruck hat eine lokale Variable name , die bei der Ausführung mit

von der Direktive mit dem Wert von testName überschrieben wird %Vor%

Merken - die Funktion addName in myDir2 ist NICHT identisch mit der Funktion addName in myDir1 . Es ist eine neue Funktion, die den Ausdruck

auswertet %Vor%

für den übergeordneten Bereich und gibt das Ergebnis zurück.

Wenn Sie diese Logik auf myDir3 anwenden, lautet der ausgewertete Ausdruck:

%Vor%

Beachten Sie, dass die einzige lokale Variable in diesem Ausdruck "testName" ist. Also, wenn Sie myDir3 mit

aufrufen %Vor%

Es gibt keine lokale Variable name , die überschrieben werden soll, und testName ist nicht definiert.

Puh! Kein Wunder, das verwirrt NUR ÜBER JEDEN!

Wie Sie in Ihrem Beispiel beheben können:

Sie möchten, dass die Ausdrücke zur tatsächlichen Funktion in myDir1 ausgewertet werden.

%Vor%

Hier ist der funktionierende Stift

Schlussbemerkung - Der Grund, warum '&' passender ist als '=' ist hier, dass '=' tatsächlich eine $watch und bidirektional die Variablen zwischen den Direktiven einrichtet. Dies bedeutet, dass myDir2 tatsächlich die Funktion appName in myDir1 ändern kann, was nicht erforderlich und unerwünscht ist. Es erfordert auch die Einrichtung von zwei $watch s, die ich aus Performance-Gründen in Angular vermeiden möchte.

    
Joe Enzminger 21.04.2015, 14:37
quelle
4

Es gibt zwei Möglichkeiten, eine Funktion in einem isolierten Bereich zu übergeben. Während '& amp;' stellt sicher, dass das, was Sie übergeben, tatsächlich eine Funktion ist, Sie können auch eine Funktion als gebundene Variable mit '=' übergeben und nur bei Bedarf aufrufen. Diese Methode hat Nachteile, aber sie wird die Steuerung des Aufrufs der Komponente überlassen, die für diesen Aufruf verantwortlich ist.

Ihr Code-Partner funktioniert

%Vor%     
Aviv Shaked 21.04.2015 05:04
quelle
0

Das Problem mit Ihrem Code mit drei verschachtelten Direktiven ist, dass testName nicht im isolierten Bereich von myDir2 existiert. Sie können dies aus myDir3 setzen, aber dafür müssen Sie ein Objekt im Bereich von myDir2 erstellen und seine Eigenschaft auf testName setzen und dann diese Eigenschaft in myDir2

verwenden

Das Arbeitsbeispiel ist hier Ссылка

    
Nils 21.04.2015 05:33
quelle
-1

Sie können auf einen Elementbereich zugreifen, indem Sie isolateScope()

verwenden

Ersetzen Sie in der myDir1 -Direktive stattdessen controller anstelle von

%Vor%

Eine andere Möglichkeit besteht darin, $$nextSibling zu benutzen, um den nächsten Bereich nach dem aktuellen Elternteil zu bekommen (habe das nicht wirklich benutzt, also möge es lesen)

Dies ist wahrscheinlich nicht der "eckige Weg", Dinge zu tun. Ich denke, das Entfernen des isolierten Bereichs von den Kind-Direktiven und deren Referenz auf das Modell der Eltern-Direktive wäre ideal.

    
RSquared 21.04.2015 04:48
quelle

Tags und Links