Eu tenho um exemplo angularJS
<div ng-controller="testCtrl">
<test color1="color1" updateFn="updateFn()"></test>
</div>
<script>
angular.module('dr', [])
.controller("testCtrl", function($scope) {
$scope.color1 = "color";
$scope.updateFn = function() {
alert('123');
}
})
.directive('test', function() {
return {
restrict: 'E',
scope: {color1: '=',
updateFn: '&'},
template: "<button ng-click='updateFn()'>Click</button>",
replace: true,
link: function(scope, elm, attrs) {
}
}
});
</script>
</body>
</html>
Desejo que, quando clicar no botão, a caixa de alerta será exibida, mas nada será exibido.
Alguém pode me ajudar?
replace
atributo foi descontinuado no AngularJS: stackoverflow.com/questions/24194972/…updateFn({msg: 'my message'});
deve ser usado nesse formato ao fazer a chamada de função dentro dalink
função da diretiva .Talvez esteja faltando alguma coisa, mas, embora as outras soluções chamem a função de escopo pai, não há capacidade de passar argumentos do código de diretiva, isso ocorre porque a
update-fn
chamada é feitaupdateFn()
com parâmetros fixos, por exemplo{msg: "Hello World"}
. Uma pequena mudança permite que a diretiva passe argumentos, o que eu consideraria muito mais útil.Observe que o HTML está passando uma referência de função, ou seja, sem
()
colchetes.JS
Portanto, acima, o HTML está chamando a
callUpdate
função de escopo local , que 'busca' o updateFn do escopo pai e chama a função retornada com parâmetros que a diretiva pode gerar.http://jsfiddle.net/mygknek2/
fonte
ng-click="updateFn()('Directive Args')"
Na tag Html da diretiva 'test', o nome do atributo da função não deve ser camelCased, mas baseado em traços.
então - em vez de:
escrever:
Esta é a maneira angular de dizer a diferença entre os atributos da diretiva (como a função update-fn) e as funções.
fonte
Que tal passar a função do controlador com ligação bidirecional ? Em seguida, você pode usá-lo na diretiva exatamente da mesma maneira que em um modelo regular (retirei partes irrelevantes por simplicidade):
Cheguei a essa pergunta, porque tentei o método acima antes, mas de alguma forma não funcionou. Agora funciona perfeitamente.
fonte
use traço e letras minúsculas para o nome do atributo (como outras respostas disseram):
E use "=" em vez de "&" no escopo da diretiva:
Então você pode usar o updateFn como qualquer outra função:
Ai está!
fonte
update-fn="updateFn"
Eu tive que usar a ligação "=" em vez de "&" porque isso não estava funcionando. Comportamento estranho.
fonte
update-fn="updateFn()"
deve incluir os parênteses (e talvez os parâmetros). Passando-o como uma função de referênciaupdate-fn="updateFn"
não vai funcionar com a&
ligação@JorgeGRC Obrigado pela sua resposta. Uma coisa, no entanto, a parte "talvez" é muito importante. Se você possui parâmetros, também deve incluí-los no seu modelo e especificar seus locais, por exemplo
updateFn({msg: "Directive Args"}
.fonte