Ich möchte eine Direktive erstellen, die auf ein Attribut verweist. Das Attribut gibt die Funktion an, die für den Bereich aufgerufen werden soll. Ich möchte aber auch ein Argument an die Funktion übergeben, die innerhalb der Link-Funktion festgelegt ist.
<div my-method='theMethodToBeCalled'></div>
In der Link-Funktion binde ich an ein jQuery-Ereignis, das ein Argument übergibt, das ich an die Funktion übergeben muss:
app.directive("myMethod",function($parse) {
restrict:'A',
link:function(scope,element,attrs) {
var expressionHandler = $parse(attrs.myMethod);
$(element).on('theEvent',function( e, rowid ) {
id = // some function called to determine id based on rowid
scope.$apply(function() {expressionHandler(id);});
}
}
}
app.controller("myController",function($scope) {
$scope.theMethodToBeCalled = function(id) { alert(id); };
}
Ohne die ID zu übergeben, kann ich es zum Laufen bringen, aber sobald ich versuche, ein Argument zu übergeben, wird die Funktion nicht mehr aufgerufen
angularjs-directive
rekna
quelle
quelle
Antworten:
Markos Lösung funktioniert gut .
Im Gegensatz zur empfohlenen Angular-Methode (wie in Treeface's Plunkr gezeigt) wird ein Callback-Ausdruck verwendet, für den der expressionHandler nicht definiert werden muss. In Markos Beispieländerung:
In Vorlage
In Direktiven-Link-Funktion
Dies hat einen Nachteil gegenüber der Lösung von marko: Beim ersten Laden wird die Funktion MethodToBeCalled mit myParam === undefined aufgerufen.
Eine funktionierende Exampe finden Sie unter @treeface Plunker
quelle
Nur um den anderen Antworten einige Informationen hinzuzufügen - die Verwendung
&
ist ein guter Weg, wenn Sie einen isolierten Bereich benötigen.Der Hauptnachteil von Markos Lösung besteht darin, dass Sie gezwungen sind, einen isolierten Bereich für ein Element zu erstellen. Sie können jedoch nur einen Bereich für ein Element festlegen (andernfalls tritt ein Winkelfehler auf: Mehrere Direktiven [Direktive1, Direktive2] fragen für isolierten Bereich )
Das bedeutet du :
Da in der ursprünglichen Frage eine Richtlinie verwendet wird,
restrict:'A'
kann es in größeren Situationen häufig vorkommen, dass in beiden Situationen ein isolierter Geltungsbereich verwendet wird. Dies ist keine gute Praxis und auch nicht erforderlich. Tatsächlich hatte rekna in diesem Fall eine gute Intuition und hätte fast funktioniert. Das einzige, was er falsch machte, war, die $ parsed- Funktion falsch aufzurufen (siehe, was sie hier zurückgibt: https://docs.angularjs.org/api/). ng / service / $ parse ).TL; DR; Fragencode behoben
und der Code
quelle
$parse
.Sie wissen nicht genau, was Sie tun möchten ... aber hier ist eine mögliche Lösung.
Erstellen Sie einen Bereich mit einer '&' - Eigenschaft im lokalen Bereich. Es "bietet eine Möglichkeit, einen Ausdruck im Kontext des übergeordneten Bereichs auszuführen" ( Einzelheiten finden Sie in der Direktivendokumentation ).
Mir ist auch aufgefallen, dass Sie eine Kurzverknüpfungsfunktion verwendet und dort Objektattribute eingefügt haben. Das kannst du nicht machen. Es ist klarer (imho), nur das Direktivendefinitionsobjekt zurückzugeben. Siehe meinen Code unten.
Hier ist ein Codebeispiel und eine Geige .
quelle
Sie können eine Direktive erstellen, die einen Funktionsaufruf mit Parametern ausführt, indem Sie mit
attrName: "&"
auf den Ausdruck im äußeren Bereich verweisen.Wir wollen die
ng-click
Richtlinie ersetzen durchng-click-x
:Wenn wir diesen Umfang hätten:
Wir könnten unsere Richtlinie so schreiben:
Hier ist eine Live-Demo: http://plnkr.co/edit/4QOGLD?p=info
quelle
Folgendes hat bei mir funktioniert.
HTML mit der Direktive
HTML der Direktive: orderitem.directive.html
Geltungsbereich der Richtlinie:
quelle
Meine Lösung:
complete
)Richtlinie
Polymerkomponente
Seite
searchData
ist die Steuerfunktionquelle
Das sollte funktionieren.
quelle