Quero criar uma diretiva que vincule a um atributo. O atributo especifica a função que deve ser chamada no escopo. Mas também quero passar um argumento para a função que é determinada dentro da função de link.
<div my-method='theMethodToBeCalled'></div>
Na função de link, eu ligo a um evento jQuery, que passa um argumento que preciso passar para a função:
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); };
}
Sem passar o id posso fazer funcionar, mas assim que tento passar um argumento, a função não é mais chamada
angularjs-directive
Rekna
fonte
fonte
Respostas:
A solução de Marko funciona bem .
Para contrastar com a forma Angular recomendada (como mostrado pelo plunkr da face da árvore) é usar uma expressão de retorno de chamada que não requer a definição de expressionHandler. No exemplo de mudança de marko:
Em modelo
Na função de ligação diretiva
Isso tem uma desvantagem em comparação com a solução de marko - no primeiro carregamento, a funçãoMethodToBeCalled será chamada com myParam === indefinido.
Um exemplo prático pode ser encontrado em @treeface Plunker
fonte
Apenas para adicionar algumas informações às outras respostas - usar
&
é uma boa maneira se você precisar de um escopo isolado.A principal desvantagem da solução de marko é que ele força você a criar um escopo isolado em um elemento, mas você só pode ter um deles em um elemento (caso contrário, você encontrará um erro angular: várias diretivas [diretiva1, diretiva2] perguntando para escopo isolado )
Isso significa que você:
Uma vez que a questão original usa uma diretiva com
restrict:'A'
ambas as situações, pode surgir muitas vezes em aplicações maiores, e usar um escopo isolado aqui não é uma boa prática e também desnecessário. Na verdade, rekna teve uma boa intuição neste caso, e quase a fez funcionar, a única coisa que ele estava fazendo de errado foi chamar a função $ parsed de forma errada (veja o que ela retorna aqui: https://docs.angularjs.org/api/ ng / service / $ parse ).TL; DR; Código de pergunta corrigido
e o código
fonte
$parse
.Não sabendo exatamente o que você quer fazer ... mas ainda aqui está uma possível solução.
Crie um escopo com uma propriedade '&' - no escopo local. Ele "fornece uma maneira de executar uma expressão no contexto do escopo pai" (consulte a documentação da diretiva para obter detalhes).
Também notei que você usou uma função de ligação abreviada e colocou atributos de objeto nela. Você não pode fazer isso. É mais claro (imho) retornar apenas o objeto de definição de diretiva. Veja meu código abaixo.
Aqui está um exemplo de código e um violino .
fonte
Você pode criar uma diretiva que execute uma chamada de função com parâmetros usando o
attrName: "&"
para fazer referência à expressão no escopo externo.Queremos substituir a
ng-click
diretiva porng-click-x
:Se tivéssemos este escopo:
Poderíamos escrever nossa diretiva assim:
Aqui está uma demonstração ao vivo: http://plnkr.co/edit/4QOGLD?p=info
fonte
Aqui está o que funcionou para mim.
Html usando a diretiva
Html da diretiva: orderitem.directive.html
Âmbito da diretiva:
fonte
Minha solução:
complete
)Diretriz
Componente de polímero
Página
searchData
é a função de controlefonte
Isso deve funcionar.
fonte