Cairngorm V: Eventos

El concepto de EventDispatcher y de listener (quizás también pudiéramos incluir el de evento) están tomados del patrón Observer. Estos conceptos escapan un poco al enfoque de este manual pero se puede encontrar más información en livedocs o en wikipedia.

Una de las primeras necesidades que aparece al empezar a trabajar con eventos es parametrizar las invocaciones de los Commands. Para satisfacer esta necesidad se tienen que utilizar custom Events. Concretamente, como hemos visto, el evento a lanzar tiene que ser un CairngormEvent o cualquier otro evento que herede directa o indirectamente de él. Es en estas subclases donde podemos añadir información concreta para una determinada familia de invocaciones o casos de usos.


Pongamos por ejemplo los siguientes casos de uso:

  • Dado un objeto complejo PersonVO almacenar los datos en un sistema de persitencia (BBDD, fichero, etc) (Create de datos)
  • Dado un objeto complejo PersonVO guardar los cambios en el registro (Update de datos).
  • Dado un objeto complejo PersonVO elminarlo de la capa de persistencia (Delete de datos)
  • Dado un objeto complejo PersonVO sumar un año al campo edad.

Todos estos casos de uso coinciden en que usan objetos PersonVO (encapsulan un objeto PersonVO en la petición), pero efectúan distintas operaciones sobre él (lo discrimina el atributo type del evento). Estas acciones las mapearemos en tres Commands distintos y crearemos un evento PersonEvent que herede de CairngormEvent que añada una propiedad person.

[ftf w=”500″ h=”400″]
package com.mif.cairngormTutorial1.events
{
import flash.events.Event;
import com.mif.cairngormTutorial1.vos.PersonVO;

public class PersonEvent extends Event
{
public static const NEW_PERSON:String = “newPerson”;
public static const UPDATE_PERSON:String = “updatePerson”;
public static const DELETE_PERSON:String = “deletePerson”;
public static const ADD_YEAR:String = “addYear”;

public var person:PersonVO;

public function PersonEvent (type:String, person:PersonVO)
{
super (type);
this.person = person;
}
}
}[/ftf]

La forma en que lo usaríamos:

[ftf w=”500″ h=”180″]
var p:PersonVO = new PersonVO();
p.name = “Xavi”;
p.surname = “Beumala”;
p.age = 25;

var evt:PersonEvent = new PersonEvent (PersonEvent.NEW_PERSON, p);
CairngormEventDispatcher.getInstance().dispatchEvent (evt);
[/ftf]

Lo cual nos obligaría a tener declarado en el FrontController un command con key NEW_PERSON:
[ftf w=”500″ h=”100″]
this.addCommand (PersonEvent.UPDATE_PERSON, UpdatePersonCommand);
this.addCommand (PersonEvent.NEW_PERSON, NewPersonCommand);
this.addCommand (PersonEvent.UPDATE_PERSON, UpdatePersonCommand);[/ftf]

De una forma un tanto brusca, podríamos llegar a decir que lo único que estamos haciendo, en el caso de Cairngorm, cuando lanzamos un evento es ejecutar el método execute de un determinado Command, al cual le llega como parámetro el evento lanzado. Tal como decíamos antes esta sistemática tiene más implicaciones, y es que la invocación del método execute es reproducible/repetible a posteriori simplemente almacenando el evento que ha originado la ejecución. Por otro lado garantiza que los Commands sean totalmente ortogonales al resto del aplicativo y que no tengan dependencia con información contextual superflua o fácilmente accesible y referenciable. Dicho de otra forma, los commands son independientes y no tienen grandes dependencias con el resto del aplicativo, lo cual permite su reutilización en contextos totalmente diferentes al pensado inicialmente.

Xavi es un Technical Arquitect de Aplicaciones RIA basadas en la Plataforma Flash trabajando para Adobe en Londres. Especializado en aplicaciones colaborativas en tiempo real, e-learning y CMS (Content Management Systems) utiliza Flex, LCDS, BlazeDS, FMS y Java principalmente.

Sitio Web:http://www.code4net.com

5 Comentarios

  1. Pingback: MadeInFlex » Blog Archive » Cairngorm VI:Services y ServiceLocator

  2. Pingback: Joan | Garnet Flex:Flash:PHP:MySQL:JS » Serie completa sobre Cairngorm en MadeInFlex

  3. Ramón

    Hola,
    Mirando el ejemplo de eventos en Cairngorm , me surge una duda:
    Cogiendo el ejemplo de PersonEvent
    var evt:PersonEvent = new PersonEvent( PersonEvent.EVENT_GET_PERSON,p );
    evt.dispatch();

    Es posible añadir a un evento cairngorm un listener en la vista donde se ejecuta , es decir algo como:

    evt.addEventListener( PersonEvent.EVENT_GET_PERSON , gettingPeson);

    private function gettingPeson(evt:*){
    //
    }

    o tengo que añadir un evento personalizado en el command de dicho evento ?

    No sé si me he explicado.

  4. Mariano Aro

    😯 😯 😯

    Porque dices: “Estas acciones las mapearemos en tres Commands distintos y crearemos un evento PersonEvent que herede de CairngormEvent que añada una propiedad person.”

    y luego implementas:


    public class PersonEvent extends Event

    Los que leemos el blog queremos aprender, no resolver crucigramas.

    Muchas gracias por el/los articulo/s

  5. Pingback: Serie completa sobre Cairngorm en MadeInFlex : Joan Garnet :: Arquitectura y desarrollo RIA

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acerca de Made In Flex

Made In Flex es una comunidad de desarrolladores de Apache Flex creada en 2006.

Apache Flex, anteriormente conocido como Adobe Flex, es un SDK (kit de desarrollo de software) para crear aplicaciones enriquecidas - multiplataforma basadas en Adobe Flash donado por Adobe a la fundación Apache in 2011 y promocionado a proyecto de primer nivel en Diciembre de 2012.

Actualmente estamos cambiando muchos aspectos del sitio web para ofrecer un sitio útil para toda la comunidad que tenga en cuenta las necesidades actuales.

Últimas Fotos

Instalador de Apache Flex

Entrar o Registrase