Chcę utworzyć dyrektywę, która łączy się z atrybutem. Atrybut określa funkcję, która powinna zostać wywołana w zakresie. Ale chcę również przekazać argument do funkcji, która jest określona w funkcji łącza.
<div my-method='theMethodToBeCalled'></div>
W funkcji link łączę się ze zdarzeniem jQuery, które przekazuje argument, który muszę przekazać do funkcji:
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); };
}
Bez przekazywania identyfikatora mogę sprawić, że zacznie działać, ale jak tylko spróbuję przekazać argument, funkcja nie jest już wywoływana
angularjs-directive
rekna
źródło
źródło
Odpowiedzi:
Rozwiązanie Marko działa dobrze .
W odróżnieniu od zalecanego sposobu Angulara (jak pokazuje plunkr treeface) jest użycie wyrażenia zwrotnego, które nie wymaga definiowania wyrażenia expressionHandler. W przykładzie Marko zmień:
W szablonie
W funkcji linku dyrektywy
Ma to jedną wadę w porównaniu z rozwiązaniem marko - przy pierwszym załadowaniu funkcjaMethodToBeCalled zostanie wywołana z myParam === undefined.
Działający przykład można znaleźć pod adresem @treeface Plunker
źródło
Aby dodać trochę informacji do innych odpowiedzi - użycie
&
jest dobrym sposobem, jeśli potrzebujesz izolowanego zakresu.Główną wadą rozwiązania Marko jest to, że zmusza cię do utworzenia izolowanego zakresu na elemencie, ale możesz mieć tylko jeden z nich na elemencie (w przeciwnym razie napotkasz błąd kątowy: Wiele dyrektyw [dyrektywa1, dyrektywa2] pyta dla zakresu izolowanego )
To znaczy ty :
Ponieważ pierwotne pytanie używa dyrektywy, a
restrict:'A'
obie sytuacje mogą wystąpić dość często w większych aplikacjach, a użycie izolowanego zakresu tutaj nie jest dobrą praktyką, a także jest niepotrzebne. W rzeczywistości rekna miał dobrą intuicję w tym przypadku i prawie działał, jedyną rzeczą, którą robił źle, było błędne wywołanie funkcji $ parsed (zobacz, co zwraca tutaj: https://docs.angularjs.org/api/ ng / service / $ parse ).TL; DR; Naprawiono kod pytania
i kod
źródło
$parse
.Nie wiem dokładnie, co chcesz zrobić ... ale nadal jest możliwe rozwiązanie.
Utwórz zakres z właściwością „&” w zakresie lokalnym. „Zapewnia sposób wykonania wyrażenia w kontekście zakresu nadrzędnego” (szczegóły w dokumentacji dyrektywy ).
Zauważyłem również, że użyłeś skróconej funkcji łączącej i umieściłeś tam atrybuty obiektów. Nie możesz tego zrobić. Bardziej jasne jest (imho), aby po prostu zwrócić obiekt definicji dyrektywy. Zobacz mój kod poniżej.
Oto przykładowy kod i skrzypce .
źródło
Możesz utworzyć dyrektywę, która wykonuje wywołanie funkcji z parametrami, używając
attrName: "&"
do odwoływania się do wyrażenia w zakresie zewnętrznym.Chcemy zastąpić
ng-click
dyrektywęng-click-x
:Gdybyśmy mieli taki zakres:
Możemy napisać naszą dyrektywę w ten sposób:
Oto demo na żywo: http://plnkr.co/edit/4QOGLD?p=info
źródło
Oto, co zadziałało dla mnie.
Html za pomocą dyrektywy
Html dyrektywy: orderitem.directive.html
Zakres dyrektywy:
źródło
Moje rozwiązanie:
complete
)Dyrektywa
Komponent polimerowy
Strona
searchData
jest funkcją kontrolnąźródło
To powinno działać.
źródło