Flex/AS3 – Truques e Dicas #7 – Custom Event


Os custom events podem ser muito uteis quando não queremos estar dependentes dos eventos da aplicação, ou simplesmente para efectuarmos alguma ação em determinada altura commo vou mostrar em baixo. Mas o principal objectivo deste post é mostrar como criar um evento que além de se comportar como tal também servirá para guardar e transferir dados que estarão acessiveis na função de escuta quando o evento for disparado.

Vejam um exemplo de um “custom event” normal:

var customEvent:Event = new Event("meuEvento");

Desta forma, acabamos por ter um evento pessoal chamado meuEvento que para o disparar:

dispatchEvent(customEvent);
//ou directamente:
dispatchEvent(new Event("meuEvento"));

Para escutar este evento:

addEventListener("meuEvento", minhaFuncaoEvento);
 
private function minhaFuncaoEvento(evt:Event):void {
//codigo
}

Este é o procedimento normal de um custom event.

O meu problema na aplicação era de como passar dados no evento, ou seja, aproveitar um evento para enviar dados, por exemplo de um módulo para outro ou até simplesmente de um itemRender para o seu parent, ou tão simplesmente de um componente para outro. Se pensarmos que todos os eventos são classes, podemos pensar que estas podem ser extendidas, logo podem ser personalizados… vejamos um evento chamado meuEvPessoal:

package
{
    
import flash.events.Event;
 
    
public class meuEvPessoal extends Event
    
{
        
public function meuEvPessoal(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
        
{
            
super(type, bubbles, cancelable);
        
}
 
    
}
}

Neste momento temos um evento chamado meuEvPessoal derivado da class Event o que nos permite chama-lo da mesma forma que um evento:

import meuEvPessoal;
 
dispatchEvent(new meuEvPessoal("meuEvento"));

E escuta-lo da seguinte forma:

addEventListener("meuEvento", minhaFuncaoEvento);
 
private function minhaFuncaoEvento(evt:meuEvPessoal):void {
//codigo
}

A partir de agora é simples, basta adicionar variaveis no nosso evento que elas estarão disponiveis na função que o escuta, vejam o evento:

package
{
    
import flash.events.Event;
 
    
public class meuEvPessoal extends Event
    
{
        
public var itemID:int=0;
        
public var dados1:String=null;
        
public var dados2:Boolean=false;
 
        
public function meuEvPessoal(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
        
{
            
super(type, bubbles, cancelable);
        
}
 
    
}
}

Neste momento podemos fazer:

import meuEvPessoal;
 
var evento:meuEvPessoal = new meuEvPessoal("meuEvento");
evento.itemID=5;
evento.dados1="OLA VINDO DO EVENTO!";
evento.dados2=true;
dispatchEvent(evento);

Nesta altura o evento é disparado com as variaveis alteradas, pelo que na função de escuta estes dados estão disponiveis:

addEventListener("meuEvento", minhaFuncaoEvento);
 
private function minhaFuncaoEvento(evt:meuEvPessoal):void {
trace("Evento Detectado: "+evt.name);
trace("itemID: "+evt.itemID);
trace("dados1: "+evt.dados1);
trace("dados2: "+evt.dados2);
}

E pronto, é isto… uma dica muito util… principalmente quando estamos sem saida na hora de passar dados de um componente para o outro, mas existem centenas de casos em que este uso se torna viável.

Espero que seja util.

Abraço.

Deixe um comentário ou um Trackback
   

4 Comentários

  1. Fredy
    April 7, 2009 às 12:52 pm | Permalink

    Só faltou comentar a importância do método Clone!
    Porque se for dar um redispatch no evento, ele não vai ter mais as propriedades preenchidas :)
    hehe

  2. April 7, 2009 às 1:53 pm | Permalink

    Fredy, claro, neste caso fiz o exemplo simples para “transportar” dados entre o dispatcher e o listener e não para os guardar no mesmo. Poder-se-ia utilizar o principio de singleton para impedir a re-iniciação da class ( new meuEVPessoal ) e manter os dados da mesma.

  3. May 8, 2009 às 1:21 pm | Permalink

    Muito bom, mas não reprecisamos usar o super(), ele é meio “pesado”, podemos usar o object evento direto para atribuir ou destruir variaveis, vejo o super() um problema igual ao estinto prototype() no AS2.

    Obrigado.

  4. Márcio Ozório
    January 14, 2012 às 3:13 pm | Permalink

    Já usei eventos customizados alguma vezes, mais agora estou tentando disparar um evento de um popup mais o evento que escuta não esta captando. Alguma dica para estes casos?

Um Trackback

  1. [...] que exemplificam o uso de Custom Events:Using Events – LiveDocsCustom Events – LiveDocsFlex/AS3 – Truques e Dicas #7 – Custom EventEventos personalizados no FlexPassando parâmetros entre Pop-Up e Application no FlexEventos [...]

Deixe um comentário

O seu email nunca será publicado ou partilhado. Campos obrigatórios estão marcados com um *

*
*

Spam Protection by WP-SpamFree