Quiero crear una directiva que se vincule a un atributo. El atributo especifica la función que debe llamarse en el ámbito. Pero también quiero pasar un argumento a la función que se determina dentro de la función de enlace.
<div my-method='theMethodToBeCalled'></div>
En la función de enlace, me vinculo a un evento jQuery, que pasa un argumento que necesito pasar a la función:
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); };
}
Sin pasar la identificación, puedo hacer que funcione, pero tan pronto como intento pasar un argumento, la función ya no se llama
angularjs-directive
rekna
fuente
fuente
Respuestas:
La solución de Marko funciona bien .
Para contrastar con la forma angular recomendada (como se muestra en plunkr de treeface) es usar una expresión de devolución de llamada que no requiere definir el expressionHandler. En el cambio de ejemplo de marko:
En plantilla
En función de enlace directivo
Esto tiene una desventaja en comparación con la solución de marko: en la primera carga, la funciónMethodToBeCalled se invocará con myParam === undefined.
Puede encontrar un ejemplo de trabajo en @treeface Plunker
fuente
Solo para agregar algo de información a las otras respuestas, usar
&
es una buena manera si necesita un alcance aislado.La principal desventaja de la solución de marko es que te obliga a crear un ámbito aislado en un elemento, pero solo puedes tener uno de esos en un elemento (de lo contrario, te encontrarás con un error angular: varias directivas [directive1, directive2] preguntando para alcance aislado )
Esto significa tu :
Dado que la pregunta original utiliza una directiva,
restrict:'A'
ambas situaciones pueden surgir con bastante frecuencia en aplicaciones más grandes, y utilizar un ámbito aislado aquí no es una buena práctica y también es innecesario. De hecho, rekna tenía una buena intuición en este caso, y casi lo hizo funcionar, lo único que estaba haciendo mal era llamar mal a la función $ parsed (vea lo que devuelve aquí: https://docs.angularjs.org/api/ ng / service / $ parse ).TL; DR; Código de pregunta fijo
y el codigo
fuente
$parse
.Sin saber exactamente lo que quiere hacer ... pero aún así, hay una posible solución.
Cree un ámbito con una propiedad '&' - en el ámbito local. "Proporciona una forma de ejecutar una expresión en el contexto del ámbito principal" (consulte la documentación de la directiva para obtener más detalles).
También noté que usaste una función de vinculación abreviada y metiste atributos de objeto allí. No puedes hacer eso. Es más claro (en mi humilde opinión) simplemente devolver el objeto de definición de directiva. Vea mi código a continuación.
Aquí hay una muestra de código y un violín .
fuente
Puede crear una directiva que ejecute una llamada a función con parámetros utilizando
attrName: "&"
para hacer referencia a la expresión en el ámbito externo.Queremos reemplazar la
ng-click
directiva conng-click-x
:Si tuviéramos este alcance:
Podríamos escribir nuestra directiva así:
Aquí hay una demostración en vivo: http://plnkr.co/edit/4QOGLD?p=info
fuente
Esto es lo que funcionó para mí.
Html usando la directiva
Html de la directiva: orderitem.directive.html
Alcance de la directiva:
fuente
Mi solución:
complete
)Directiva
Componente polimérico
Página
searchData
es la función de controlfuente
Esto debería funcionar.
fuente