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

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:

[coolcode] var customEvent:Event = new Event(“meuEvento”);
[/coolcode]

Desta forma, acabamos por ter um evento pessoal chamado meuEvento que para o disparar:
[coolcode] dispatchEvent(customEvent);
//ou directamente:
dispatchEvent(new Event(“meuEvento”));
[/coolcode]

Para escutar este evento:
[coolcode] addEventListener(“meuEvento”, minhaFuncaoEvento);

private function minhaFuncaoEvento(evt:Event):void {
//codigo
}
[/coolcode]

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:

[coolcode] 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);
}

}
}
[/coolcode]

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

[coolcode] import meuEvPessoal;

dispatchEvent(new meuEvPessoal(“meuEvento”));

[/coolcode] E escuta-lo da seguinte forma:

[coolcode] addEventListener(“meuEvento”, minhaFuncaoEvento);

private function minhaFuncaoEvento(evt:meuEvPessoal):void {
//codigo
}
[/coolcode] 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:
[coolcode] 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);
}

}
}
[/coolcode] Neste momento podemos fazer:
[coolcode] import meuEvPessoal;

var evento:meuEvPessoal = new meuEvPessoal(“meuEvento”);
evento.itemID=5;
evento.dados1=”OLA VINDO DO EVENTO!”;
evento.dados2=true;
dispatchEvent(evento);
[/coolcode] Nesta altura o evento é disparado com as variaveis alteradas, pelo que na função de escuta estes dados estão disponiveis:
[coolcode] 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);
}
[/coolcode]

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.


5 comments

add yours
  • Fredy April 7, 2009

    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

  • Mário Santos April 7, 2009

    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.

  • rafael Feijó May 8, 2009

    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.

  • […] 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 […]

  • Márcio Ozório January 14, 2012

    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?

Leave a Comment

Post