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 😀

 

33 comentarios para “Pasar parámetros al addEventListener en AS3”

  1. Gracias, me ha sido de gran ayuda.

    Un saludo!

  2. excelente

  3. me sirvio la forma en que lo presenta Mojorochi, gracias por el aporte.

  4. gracias hombre, funciona. muy bueno.

  5. 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:

    btnAgrImg.addEventListener(MouseEvent.CLICK, function(e:MouseEvent){f_agregaObjeto(e,'img')});
    btnAgrTexto.addEventListener(MouseEvent.CLICK, function(e:MouseEvent){f_agregaObjeto(e,'txt')});
    
    var metodo:Function= function(e:MouseEvent){f_agregaObjeto(e,'dato');
    e.currentTarget.removeEventListener(MouseEvent.CLICK,metodo);
    //se elimina el listener por referencia al hacer un click
    }
    btnAgrDato.addEventListener(MouseEvent.CLICK,metodo);
    
    	/*Humberto Javier Martínez Sandoval*/
    	private function f_agregaObjeto(e:MouseEvent,tipo:String):void{
    		switch(tipo){
    			case 'txt':
    			trace(e.currentTarget.name+' quieres agregar texto');
    			break;
    			case 'img':
    			trace(e.currentTarget.name+' quieres agregar imagen');
    			break;
    			case 'dato':
    			trace(e.currentTarget.name+' quieres agregar datos');
    			break;
    			}
    		}
  6. Soy nuevo en AS3 y la verdad que esto me salvo en un proyecto, muchas gracias!!!!

  7. Esto estuvo genial, me salvaste!! jaja 😀

  8. Muchas gracias Ivan

    Un saludo

  9. Salva, porque la clase Callback.as debería estar en la ruta net/wildwinter/Callback.as tal y como indica el package.

  10. 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

  11. 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

  12. 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.

  13. Classback?
    Mira a ver si lo has escrito bien, es Callback.as

  14. 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

  15. 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?

  16. Oh! gracias que buena clase

  17. muchas gracias, me sirvió mucho

  18. Daniel H. Olivau dice:

    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.

  19. 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/

  20. 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:

    var _callback:Function = Callback.create(plegar, true);
    plegar_btn.addEventListener(MouseEvent.MOUSE_UP, _callback);
    
    plegar_btn.removeEventListener(MouseEvent.MOUSE_UP, _callback);
    

    2) Usar referencias débiles para el listener, pero eso no he podido comprobar si realmente es significativo en memoria.

    plegar_btn.addEventListener(MouseEvent.MOUSE_UP, Callback.create(plegar, true), false, 0, true);
  21. ¿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