Pasar parámetros al addEventListener en AS3
Publicado por Iván Gajate el 5 de noviembre de 2008 en AS3, Flash, Tutoriales
Algo tan sencillo y resulta que no se puede ¿?
plegar_btn.addEventListener(MouseEvent.MOUSE_UP, plegar, true);
No me deja ponerle mas parámetro tras la referencia a la función. ¿para qué sirve una función si no le puedo pasar parámetros? Y es una pena, porque con éste método ya me había olvidado del Delegate.create… 😉
Buscando por la red, la solución que mas me convence por lo sencilla y elegante es la de Wildwinter, que se ha construido una clase Callback tal y como se hacía con el Delegate de AS2, de tal manera que ahora podemos poner
plegar_btn.addEventListener(MouseEvent.MOUSE_UP, Callback.create(plegar, true));
Y con ello conseguimos poder pasar los parámetros que queramos a la función plegar. En este caso "true", pero podría ser cualquier otro, o varios.
Lo mejor de este método frente a otros es que es un "envoltorio" del verdadero evento, con lo que en la función receptora, seguiremos teniendo como primer parámetro el evento de tipo MouseEvent.
public function plegar(event:MouseEvent, valor:Boolean):void{ trace(event); //Devuelve [MouseEvent type="mouseUp" ...] trace(valor); //Devuelve true }
La clase es esta:
// (c) 2007 Ian Thomas // Freely usable in whatever way you like, as long as it's attributed. package net.wildwinter{ public class Callback{ // Create a wrapper for a callback function. // Tacks the additional args on to any args normally passed to the // callback. public static function create(handler:Function,...args):Function{ return function(...innerArgs):void{ handler.apply(this,innerArgs.concat(args)); } } } }
Yo ya me la he guardado en el baúl de mis tesooros 😀
31 de julio de 2012 a las 20:11
Gracias, me ha sido de gran ayuda.
Un saludo!
12 de mayo de 2012 a las 14:57
excelente
10 de octubre de 2011 a las 13:54
me sirvio la forma en que lo presenta Mojorochi, gracias por el aporte.
22 de junio de 2011 a las 17:43
gracias hombre, funciona. muy bueno.
5 de marzo de 2011 a las 0:22
es una gran clase, sin embargo en actionscrip 3 sí se pueden pasar parámetros extra de forma sencilla a un método. Yo por ejemplo hice lo siguiente:
30 de abril de 2010 a las 16:29
Soy nuevo en AS3 y la verdad que esto me salvo en un proyecto, muchas gracias!!!!
29 de abril de 2010 a las 2:39
Esto estuvo genial, me salvaste!! jaja 😀
6 de abril de 2010 a las 12:17
Muchas gracias Ivan
Un saludo
6 de abril de 2010 a las 0:57
Salva, porque la clase Callback.as debería estar en la ruta net/wildwinter/Callback.as tal y como indica el package.
5 de abril de 2010 a las 18:01
Hola, resulta que creo la clase, el archivo, Callback.as y en el .fla incluyo el «import Callback;» y me da el error:
5001: El nombre del paquete ‘net.wildwinter’ no contiene la ubicación de este archivo. Cambie el nombre de la definición del paquete en este archivo, o mueva el archivo. C:\__El Trujal\Flash\Página Principal\Callback.as
¿por qué puede ser?
Gracias
22 de febrero de 2010 a las 11:41
No hay que cambiar nada en la clase, simplemente guardarla en un archivo Callback.as en net.wildwinter.
Los puntos son parametros extra, mirate esto:
http://livedocs.adobe.com/flash/9.0_es/main/00000055.html#wp38690
De todos modos, es una construcción muy enrevesada, yo solo la he usado un par de veces, casi merece mas la pena hacerse una función envolvente, o usar los Signals de Robert Penner
http://robertpenner.com/flashblog/2009/09/my-new-as3-event-system-signals.html
22 de febrero de 2010 a las 11:14
Sí, perdona, en mi fla lo he escrito bien, se me fue el santo al cielo…
En realidad, mi pregunta es, si se tiene que cambiar dónde pone «…Args» e «…innerArgs» por los parámetros de nuestro fla, porque no me suena de nada eso de args e innerargs con puntos delante…
Muchas gracias, Ivan.
22 de febrero de 2010 a las 2:27
Classback?
Mira a ver si lo has escrito bien, es Callback.as
30 de diciembre de 2009 a las 13:47
Hola Horacio
si no eliminas el Listener el evento seguirá saltando aunque el objeto no exista, en AS3 hay que tener cuidado con las cosas que se quedan abiertas porque la memoria se va cargando y los eventos siguen saltando 🙁
Mirate esto
http://www.yporqueno.es/blog/as3-cosas-que-se-deben-hacer-antes-de-descargar-un-swf
30 de diciembre de 2009 a las 2:02
En vdd que es muy bueno el articulo y el que lo ideo wildwinter, lo unico que no entiendo es por que se debe remover el Listener?
26 de diciembre de 2009 a las 22:20
Oh! gracias que buena clase
24 de junio de 2009 a las 19:35
muchas gracias, me sirvió mucho
8 de junio de 2009 a las 15:51
Realmente AS3 es un dolor de cabeza (en realidad de más abajo). Gracias por la castellanización del articulo, me funciono perfecto. Le dejare un agradecimiento a su creador también.
6 de abril de 2009 a las 22:48
Te da un error porque las clases no pueden ir en un fotograma, van en archivos externos con extensión ‘as’.
Te recomiendo que te leas algún artículo sobre AS3, los hay muy buenos en Cristalab:
http://www.cristalab.com/tips/introduccion-basica-a-actionscript-3-clases-tipos-de-datos-c29554l/
http://www.cristalab.com/tips/actionscript-3.0-parte-2-botones-eventos-geturl-y-enlaces-c29767l/
19 de diciembre de 2008 a las 13:16
mmm…. buena pregunta.
Pues mirando en el sitio de IanT, el autor, veo que se pueden hacer dos cosas. A mi me gusta más la primera:
1) Guardar una referencia al callback y luego ustilizarla en el removeEventListener:
2) Usar referencias débiles para el listener, pero eso no he podido comprobar si realmente es significativo en memoria.
19 de diciembre de 2008 a las 11:34
¿Cómo se haría el removeEventListener:
plegar_btn.removeEventListener(MouseEvent.MOUSE_UP, Callback.create(plegar, true));?
No da ningún error pero no hace el remove,….
Gracias