Emitir eventos personalizados en AS3 (II)

Publicado por Iván Gajate el 22 de noviembre de 2008 en AS3, Flash, Tutoriales

Ya vimos que se pueden emitir eventos personalizados para recogerlos con un listener, no tenemos que limitarnos a los que trae Flash por defecto.

Ahora vamos a dar un paso más. Queremos emitir un evento que diga que se ha terminado una acción, pero además queremos indicar si ha ido bien (true), o ha ido mal (false).

Este es el evento que queremos emitir:

dispatchEvent(new EventExtra("accionTerminada", true));

Creamos un nuevo evento de tipo EventExtra donde le indicamos el nombre del evento que queremos emitir y los parámetros que queramos, que para eso es nuestro evento 🙂

Vamos a ver la clase EventExtra:

package {

	import flash.events.*;

	// Extiendo la clase Event para que funcione como un evento mas al enviarse y recibirse.
	public class EventExtra extends Event{

		public var exito:Boolean;

		public function EventExtra(nombre:String, exito:Boolean=true){
			// Inicializo el constructor de Event
			super(nombre);
			// Guardo el valor de exito en una variable para poder acceder luego a ella.
			this.exito = exito;
		}
	}
}

No tiene nada especial, es un envoltorio de la clase Event pero recibe un parámetro extra que almaceno para luego poder acceder a su valor.

Así es como se recogería nuestro evento, con un listener, como siempre en AS3:

// Escucho si objetoEmisor emite el evento "accionTerminada" y le indico su detector de eventos.
objetoEmisor.addEventListener("accionTerminada", detectorAccionTerminada)

// El detector del evento, recibe un objeto evento de tipo EventExtra
function detectorAccionTerminada(evento:EventExtra):void{
	// Como tengo una referencia al evento, puedo acceder a sus variables publicas (exito).
	trace(evento.exito)
}

 

 

Ahora ya podemos crearnos objetos totalmente independientes pero que nos permitan recibir información de sus "actividades" para actuar en consecuencia. Encapsulación! 🙂

El código está simplificado para entenderlo mejor pero el concepto es el mismo. Lo único que cambiaría para hacerlo mas protegido es guardar el string "accionTerminada" en una variable de clase, y que en lugar de acceder al valor de exito directamente, hacerlo a través de un getter:

La clase algo mas protegida:

package {

	import flash.events.*;

	// Extiendo la clase Event para que funcione como un evento mas al enviarse y recibirse.
	public class EventExtra extends Event{

		public static const ACCION_TERMINADA:String = "accionTerminada";

		// Hago la variable privada para evitar que se pueda modificar desde fuera de la clase.
		private var _exito:Boolean;

		public function EventExtra(nombre:String, exito:Boolean=true){
			// Inicializo el constructor de Event
			super(nombre);
			// Guardo el valor de exito en una variable para poder acceder luego a ella.
			this._exito = exito;
		}

		// Getter publico para acceder de forma protegida al valor de _exito.
		// Al no haber un setter, evito que se asigne un valor de forma accidental, solo se recoge.
		public function get exito():Boolean{
			return _exito;
		}
	}
}


Para emitir el evento:

dispatchEvent(new EventExtra(EventExtra.ACCION_TERMINADA, true));


Y para recogerlo:

objetoEmisor.addEventListener(EventExtra.ACCION_TERMINADA, detectorAccionTerminada);

 

 

Podemos evitar el tener que modificar la clase para cada parámetro nuevo, usando un objeto.

 

12 comentarios para “Emitir eventos personalizados en AS3 (II)”

  1. […] También podemos aprovechar que es nuestro evento personalizado para pasarle variables y luego poder recogerlas. […]

  2. […] crearnos un evento genérico donde incluiremos todos los parámetros extra que queramos […]