Wie übergibt man eine Funktionsreferenz in einer rekursiven Anweisung in Angular?

7

Ich habe diese Richtlinie:

%Vor%

und hier ist der Helfer:

%Vor%

Alles funktioniert wie ein Zauber, aber mein on-node-click funktioniert nicht. Für alle Root-Elemente funktioniert der Rückruf, aber ab diesem Zeitpunkt werden alle Kinder den Rückruf nicht auslösen. Ich denke, es hat etwas damit zu tun, die Funktionsreferenz an das nächste Kind in der Vorlage zu übergeben.

Ich habe auch data-on-node-click="onNodeClick(node)" ausprobiert, aber das funktioniert auch nicht.

Weiß jemand, wie die Funktionsreferenz an die Kindknoten übergeben wird?

    
Martijn 19.11.2013, 13:49
quelle

2 Antworten

23

zugrunde liegendes Problem

Als eine Führung in seiner hilfreich zu "& amp;" was die Dokumentation so beschreibt:

  

& amp; oder & amp; attr - bietet eine Möglichkeit, einen Ausdruck im Kontext von auszuführen   der übergeordnete Bereich.

     

Oft ist es wünschenswert, Daten aus dem isolierten Bereich über einen zu übergeben   Ausdruck und zum übergeordneten Bereich kann dies durch Übergeben einer Karte erfolgen   der lokalen Variablennamen und Werte in den Ausdruck Wrapper Fn. Zum   Beispiel: Wenn der Ausdruck inkrement (Betrag) ist, können wir angeben   der Betragswert, indem localFn als localFn ({betrag: 22})

aufgerufen wird

Um dies zu erreichen, wird die Funktion, die durch & übergeben wird, in eine andere Funktion parentGet() eingeschlossen. Wir können dies in Aktion sehen, indem wir den Inhalt der Click-Handler-Funktionsvariablen betrachten. Erstens, bevor es in & übergeben wird, ist es wie erwartet:

%Vor%

Aber dann, in Ihrer Anweisung, nachdem Sie '& amp;' durchlaufen haben, sieht es so aus:

%Vor%

Anstelle eines direkten Verweises auf Ihre Click-Handler-Funktion ist dies nun ein Aufruf, der Ihre Funktion sowohl mit dem übergeordneten Bereich als auch mit locals , die Sie übergeben haben, übernimmt.

Das Problem liegt darin, dass , wenn wir die Verschachtelung der Scope-Variablen fortführen auf den neuen verschachtelten übergeordneten Scope aktualisiert wird. Das ist nicht gut für uns. Wir möchten, dass der Ausführungskontext der oberste Bereich ist, in dem sich der Click-Handler befindet. Sonst verlieren wir den Bezug auf Ihre Funktion - wie wir sehen.

Lösung

Um dies zu beheben, behalten wir einen Verweis auf die ursprüngliche Funktion (die nicht von parentGet() beim Verschachteln belastet wird). Wenn wir sie dann übergeben, ist der in parentGet() verwendete Bereich derjenige mit der Click-Handler-Funktion.

Lassen Sie uns zunächst einen anderen Namen für die eigentliche Funktion verwenden als für den Parameter. Ich habe die Funktion wie folgt eingerichtet: $scope.onNodeClickFn = function(node) {...}

Dann machen wir 3 Änderungen:

1) Fügen Sie eine zweite Bereichsvariable hinzu ( topFunc ):

%Vor%

onNodeClick ist die umbrochene Funktion (einschließlich des Umfangsparameters). Und topFunc ist ein Verweis auf die unwrapped-Funktion (beachten Sie, dass wir das übergeben, indem wir = verwenden, so dass es eine Referenz auf die Funktion ohne den Wrapper ist, auf den & zutrifft).

2) Auf der obersten Ebene übergeben wir beide Funktionsreferenzen in.

%Vor%

(Beachten Sie das Fehlen von () für den Parameter top-func .)

3) Übergeben Sie den neuen Parameter topFunc an die Vorlage:

%Vor%

Wir pflegen nun in jedem verschachtelten Bereich eine Referenz auf die ursprüngliche Funktion und verwenden diese in der Vorlage .

Sie können es in dieser Geige arbeiten sehen: Ссылка

    
KayakDave 19.11.2013, 20:38
quelle
1

Ich mache das gleiche mit einer Fragebogen-App, und die Art, wie ich die Funktion in isoliertem Umfang durch alle Ebenen vererbte, setzte die Funktion in jedes Element in der Funktion ({param: param}) Notation

In Ihrem könnte auch so sein:

%Vor%

vom Hauptcontroller (die Seite, auf der die Anweisung hinzugefügt wird) onNodeClick hat Parameter, die in die Direktive gesetzt werden. Sie müssen den Namen im on-node-click Attribut des root angeben Richtlinie, so etwas

%Vor%

und im direction Controller können Sie es auch aufrufen:

%Vor%

Andernfalls, wenn onNodeClick nur vars im Hauptcontroller betrifft (die Seite, auf der die Direktive hinzugefügt wird), können Sie den Namen der Funktion mit einem im Hauptregler existenten Parameter übergeben und ihn ohne Parameter in der Direktivencontroller.

    
CSharper 10.09.2015 21:07
quelle