Eu tenho uma diretiva de formulário que usa um callback
atributo especificado com um escopo isolado:
scope: { callback: '&' }
Ele fica dentro de um, ng-repeat
então a expressão que eu passo inclui id
o objeto como argumento para a função de retorno de chamada:
<directive ng-repeat = "item in stuff" callback = "callback(item.id)"/>
Quando terminei com a diretiva, ela chama $scope.callback()
de sua função de controlador. Na maioria dos casos, isso é bom e é tudo o que quero fazer, mas às vezes eu gostaria de adicionar outro argumento de dentro dele directive
.
Existe uma expressão angular que permita isso $scope.callback(arg2)
:, resultando em callback
ser chamado com arguments = [item.id, arg2]
?
Caso contrário, qual é a melhor maneira de fazer isso?
Eu descobri que isso funciona:
<directive
ng-repeat = "item in stuff"
callback = "callback"
callback-arg="item.id"/>
Com
scope { callback: '=', callbackArg: '=' }
e a diretiva chamando
$scope.callback.apply(null, [$scope.callbackArg].concat([arg2, arg3]) );
Mas não acho que seja particularmente interessante e envolve colocar coisas extras no escopo isolado.
Existe uma maneira melhor?
Playground Plunker aqui (tenha o console aberto).
fonte
ng
API, por exemplo,ng-click="someFunction()"
é uma expressão que avalia a execução de uma função.$scope.callback
é definido pelocallback="someFunction"
atributo e ascope: { callback: '=' }
propriedade do objeto de definição de diretiva.$scope.callback
é uma função a ser chamada posteriormente. O valor real do atributo é obviamente uma string - esse é sempre o caso do HTML.Respostas:
Se você declarar seu retorno de chamada conforme mencionado por @ lex82 como
Você pode chamar o método de retorno de chamada no escopo da diretiva com o mapa de objetos e isso faria a ligação corretamente. Gostar
sem requerer $ parse. Veja meu violino (log do console) http://jsfiddle.net/k7czc/2/
Atualização : Há um pequeno exemplo disso na documentação :
fonte
Nada de errado com as outras respostas, mas uso a seguinte técnica ao passar funções em um atributo de diretiva.
Deixe os parênteses ao incluir a diretiva no seu html:
Em seguida, "desembrulhe" a função no link ou controlador da sua diretiva. aqui está um exemplo:
A etapa "desembrulhar" permite que a função seja chamada usando uma sintaxe mais natural. Ele também garante que a diretiva funcione corretamente, mesmo quando aninhada em outras diretivas que possam passar na função. Se você não desembrulhou, se tiver um cenário como este:
Então você terminaria com algo assim em sua diretiva interna:
O que falharia em outros cenários de aninhamento.
Adaptei essa técnica a partir de um excelente artigo de Dan Wahlin em http://weblogs.asp.net/dwahlin/creating-custom-angularjs-directives-part-3-isolate-scope-and-function-parameters
Adicionei a etapa de desembrulhar para tornar a chamada da função mais natural e resolver o problema de aninhamento que encontrei em um projeto.
fonte
this
ponteiro dentro do método de retorno de chamada, porque ele usa o escopo da diretiva. Eu estou usando Typescript e meus olhares de retorno de chamada como esta: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; }
Na diretiva (
myDirective
):No modelo de diretiva:
Na fonte:
... onde
myFunction
é definido no controlador.Observe que
param
no modelo de diretiva se vincula perfeitamente àparam
fonte e está definido comoitem
.Para chamar de dentro da
link
propriedade de uma diretiva ("dentro" dela), use uma abordagem muito semelhante:fonte
Sim, existe uma maneira melhor: você pode usar o serviço $ parse em sua diretiva para avaliar uma expressão no contexto do escopo pai, enquanto vincula certos identificadores na expressão a valores visíveis apenas dentro da diretiva:
Adicione esta linha à função de link da diretiva na qual você pode acessar os atributos da diretiva.
Seu atributo de retorno de chamada pode ser definido como o
callback = "callback(item.id, arg2)"
arg2 é vinculado ao yourSecondArgument pelo serviço $ parse dentro da diretiva. Diretivas comong-click
permitem acessar o evento click por meio do$event
identificador dentro da expressão passada para a diretiva usando exatamente esse mecanismo.Observe que você não precisa tornar
callback
um membro do seu escopo isolado com esta solução.fonte
scope.$parent
faz com que a diretiva "vaze" - ela "conhece" muito do mundo exterior, o que um componente encapsulado bem projetado não deveria.Para mim, seguinte trabalho:
na diretiva declare assim:
No modelo de diretiva, use-o da seguinte maneira:
E então, quando você usar a diretiva, passe a função da seguinte maneira:
Você passa a função por sua declaração e ela é chamada de diretiva e os parâmetros são preenchidos.
fonte