Tengo un ejemplo 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>
Cuando haga clic en el botón Deseo, aparecerá el cuadro de alerta, pero no se mostrará nada.
¿Alguien puede ayudarme?
replace
atributo ha quedado en desuso en AngularJS: stackoverflow.com/questions/24194972/…updateFn({msg: 'my message'});
debe usar un mapeo de objetos en ese formato cuando se realiza la llamada a la función dentro de lalink
función de la directiva .Tal vez me falta algo, pero aunque las otras soluciones sí llaman a la función de alcance principal, no hay capacidad para pasar argumentos desde el código de la directiva, esto se debe a que
update-fn
está llamandoupdateFn()
con parámetros fijos, por ejemplo{msg: "Hello World"}
. Un ligero cambio permite que la directiva pase argumentos, lo que creo que es mucho más útil.Tenga en cuenta que el HTML pasa una referencia de función, es decir, sin
()
corchetes.JS
Entonces, en lo anterior, el HTML está llamando a la
callUpdate
función de ámbito local , que luego 'obtiene' el updateFn del ámbito primario y llama a la función devuelta con parámetros que la directiva puede generar.http://jsfiddle.net/mygknek2/
fuente
ng-click="updateFn()('Directive Args')"
En su etiqueta Html de la directiva 'prueba', el nombre del atributo de la función no debe ser camelCased, sino basado en guiones.
entonces, en lugar de:
escribir:
Esta es la forma angular de distinguir entre los atributos de la directiva (como la función update-fn) y las funciones.
fuente
¿Qué tal pasar la función del controlador con enlace bidireccional ? Luego puede usarlo en la directiva exactamente de la misma manera que en una plantilla normal (eliminé las partes irrelevantes por simplicidad):
Aterricé en esta pregunta, porque probé el método anterior, pero de alguna manera no funcionó. Ahora funciona a la perfección.
fuente
use guiones y minúsculas para el nombre del atributo (como dicen otras respuestas):
Y use "=" en lugar de "&" en el alcance de la directiva:
Luego puede usar updateFn como cualquier otra función:
Ahí tienes!
fuente
update-fn="updateFn"
Tuve que usar el enlace "=" en lugar de "&" porque eso no funcionaba. Comportamiento extraño.
fuente
update-fn="updateFn()"
, debe incluir el paréntesis (y quizás los parámetros). Pasarlo como referencia de funciónupdate-fn="updateFn"
no funcionará con el&
enlace@JorgeGRC Gracias por tu respuesta. Sin embargo, una cosa es que la parte "quizás" es muy importante. Si tiene parámetros, también debe incluirlos en su plantilla y asegurarse de especificar sus locales, por ejemplo
updateFn({msg: "Directive Args"}
.fuente