Ich habe eine Formularanweisung, die ein angegebenes callback
Attribut mit einem isolierten Bereich verwendet:
scope: { callback: '&' }
Es befindet sich in einem, ng-repeat
sodass der Ausdruck, den ich übergebe, das id
des Objekts als Argument für die Rückruffunktion enthält:
<directive ng-repeat = "item in stuff" callback = "callback(item.id)"/>
Wenn ich mit der Direktive fertig bin, ruft sie $scope.callback()
von ihrer Controller-Funktion auf. In den meisten Fällen ist dies in Ordnung und es ist alles, was ich tun möchte, aber manchmal möchte ich ein weiteres Argument aus dem Inneren heraus hinzufügen directive
.
Gibt es einen Winkelausdruck, der dies zulässt: $scope.callback(arg2)
was dazu führt, callback
dass mit aufgerufen wird arguments = [item.id, arg2]
?
Wenn nicht, wie geht das am besten?
Ich habe festgestellt, dass dies funktioniert:
<directive
ng-repeat = "item in stuff"
callback = "callback"
callback-arg="item.id"/>
Mit
scope { callback: '=', callbackArg: '=' }
und die Richtlinie aufrufen
$scope.callback.apply(null, [$scope.callbackArg].concat([arg2, arg3]) );
Aber ich denke nicht, dass es besonders ordentlich ist und es beinhaltet, zusätzliches Zeug in den isolierten Bereich zu stellen.
Gibt es einen besseren Weg?
Plunker Spielplatz hier (Konsole geöffnet haben).
quelle
ng
API. Beispielsweiseng-click="someFunction()"
handelt es sich um einen Ausdruck, der zur Ausführung einer Funktion ausgewertet wird.$scope.callback
wird durch dascallback="someFunction"
Attribut und diescope: { callback: '=' }
Eigenschaft des Direktivendefinitionsobjekts festgelegt.$scope.callback
ist eine Funktion, die zu einem späteren Zeitpunkt aufgerufen werden soll. Der eigentliche Attribut - Wert ist offensichtlich ein String - , die mit HTML immer der Fall ist.Antworten:
Wenn Sie Ihren Rückruf wie von @ lex82 erwähnt wie deklarieren
Sie können die Rückrufmethode im Direktivenbereich mit Objektzuordnung aufrufen und sie würde die Bindung korrekt ausführen. Mögen
ohne dass $ parse erforderlich ist. Siehe meine Geige (Konsolenprotokoll) http://jsfiddle.net/k7czc/2/
Update : In der Dokumentation finden Sie ein kleines Beispiel dafür :
quelle
An den anderen Antworten ist nichts auszusetzen, aber ich verwende die folgende Technik, wenn ich Funktionen in einem Direktivenattribut übergebe.
Lassen Sie die Klammern weg, wenn Sie die Direktive in Ihr HTML aufnehmen:
Dann "entpacken" Sie die Funktion im Link oder Controller Ihrer Direktive. Hier ist ein Beispiel:
Mit dem Schritt "Entpacken" kann die Funktion mit einer natürlicheren Syntax aufgerufen werden. Außerdem wird sichergestellt, dass die Direktive auch dann ordnungsgemäß funktioniert, wenn sie in anderen Direktiven verschachtelt ist, die die Funktion möglicherweise übergeben. Wenn Sie das Auspacken nicht durchgeführt haben, haben Sie ein Szenario wie das folgende:
Dann würden Sie so etwas in Ihrer inneren Richtlinie finden:
Was in anderen Verschachtelungsszenarien fehlschlagen würde.
Ich habe diese Technik aus einem ausgezeichneten Artikel von Dan Wahlin unter http://weblogs.asp.net/dwahlin/creating-custom-angularjs-directives-part-3-isolate-scope-and-function-parameters angepasst
Ich habe den Entpackungsschritt hinzugefügt, um das Aufrufen der Funktion natürlicher zu gestalten und das Verschachtelungsproblem zu lösen, auf das ich in einem Projekt gestoßen bin.
quelle
this
Zeiger nicht innerhalb der Rückrufmethode verwenden, da er den Geltungsbereich der Direktive verwendet. Ich benutze Typescript und mein Rückruf sieht folgendermaßen aus:public validateFirstName(firstName: string, fieldName: string): ng.IPromise<boolean> { var deferred = this.mQService.defer<boolean>(); ... .then(() => deferred.resolve(true)) .catch((msg) => { deferred.reject(false); }); return deferred.promise; }
In der Direktive (
myDirective
):In der Richtlinienvorlage:
In der Quelle:
...wo
myFunction
in der Steuerung definiert ist.Beachten Sie, dass
param
die Vorlage in der Direktiveparam
in der Quelle sauber gebunden ist und auf gesetzt istitem
.link
Verwenden Sie einen sehr ähnlichen Ansatz, um aus der Eigenschaft einer Direktive ("innerhalb" derselben) heraus aufzurufen :quelle
Ja, es gibt einen besseren Weg: Sie können den $ parse-Dienst in Ihrer Direktive verwenden, um einen Ausdruck im Kontext des übergeordneten Bereichs auszuwerten, während Sie bestimmte Bezeichner im Ausdruck an Werte binden, die nur in Ihrer Direktive sichtbar sind:
Fügen Sie diese Zeile der Verknüpfungsfunktion der Direktive hinzu, über die Sie auf die Attribute der Direktive zugreifen können.
Ihr
callback = "callback(item.id, arg2)"
Rückrufattribut kann dann wie folgt festgelegt werden, da arg2 vom $ parse-Dienst in der Direktive an yourSecondArgument gebunden wird. Mit Direktiven wie könnenng-click
Sie über den$event
Bezeichner innerhalb des an die Direktive übergebenen Ausdrucks auf das Klickereignis zugreifen, indem Sie genau diesen Mechanismus verwenden.Beachten Sie, dass Sie
callback
mit dieser Lösung kein Mitglied Ihres isolierten Bereichs machen müssen.quelle
scope.$parent
die Verwendung wird die Direktive "undicht" - sie "kennt" zu viel von der Außenwelt, was eine gut gestaltete gekapselte Komponente nicht sollte.Für mich hat folgendes funktioniert:
in der Richtlinie erklären Sie es so:
Verwenden Sie die Direktivenvorlage folgendermaßen:
Wenn Sie dann die Direktive verwenden, übergeben Sie die Funktion wie folgt:
Sie übergeben die Funktion durch ihre Deklaration und sie wird aus der Direktive aufgerufen und Parameter werden ausgefüllt.
quelle