O Flex diferente de outras tecnologias, possui eventos. Mais porque estes eventos são assim tão uteis?

Bom, um simples clique do mouse sobre um botão gera milhares de eventos, entre eles o MouseEvent.MOUSE_MOVE, MouseEvent.CLICK, MouseEvent.MOUSE_DOWN, MouseEvent.MOUSE_UP e outros. Cada um com sua finalidade.

Mais os eventos não servem apenas para isso.

Neste primeiro exemplo, que foi baseado no exemplo de Eventos em DataGrid, mostro como executar uma função na aplicação principal caso o usuário salve o formulário. Este evento não é despachado quando é cancelado ou quando fechado a janela. Apenas quando salvo.

Arquivo com/kraus/janelas/Editar.mxml
private function Salvar():void
{
    dispatchEvent( new Event( 'SALVO' ))
    Fechar();
}

Veja no item acima que quando salvamos a aplicação o mesmo despacha um evento com o nome de SALVO, do tipo Event e fecha a janela. Agora veja que quando criamos a janela, uma espera a este evento foi adicionado e quando executado a função eventSalvou será executado.

Arquivo main.mxml
private function editar():void
{
    var janela:Editar=PopUpManager.createPopUp( this, Editar, true ) as Editar;
    janela.init( dgFiltro.selectedItem )
    janela.addEventListener( 'SALVO', eventSalvou )
}
private function eventSalvou( e:Event ):void
{
    Alert.show( 'Usuário Salvou o cadastro!' )
}

Note também que um outro evento foi adicionado ao Datagrid, o evento de doubleClick, fazendo com que você possa clicar duas vezes sobre o DataGrid para abrir a janela.

veja como ficou o exemplo:

Uma segunda utilização para eventos é transferência de valores. Imagina agora que você precisa devolver o valor que foi atualizado para o DataGrid. Para isso temos que criar um evento customizado e estendemos a classe flash.events.Event.

Criando a nova classe

Após criada a classe tem a seguinte estrutura:

Arquivo com/kraus/event/CustomEvent.as
package com.kraus.event
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        public function CustomEvent( type:String, bubbles:Boolean=false, cancelable:Boolean=false )
        {
            super( type, bubbles, cancelable );
        }

    }
}

Esta é a estrutura padrão e não altere nada da estrutura, a não ser que saiba muito bem o que esta fazendo.

Agora vamos adicionar uma variável extática que dará os nomes aos nossos chamados e quantas variáveis forem necessário para o evento. Criei uma variável para cada item editável.

Arquivo com/kraus/event/CustomEvent.as
package com.kraus.event
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        public static var SALVOU:String = 'salvou'

        public var nome:String
        public var telefone:String
        public var email:String

        public function CustomEvent( type:String, bubbles:Boolean=false, cancelable:Boolean=false )
        {
            super( type, bubbles, cancelable );
        }
    }
}

Para estes novo exemplo duplicamos o main2.mxml e o com/kraus/janelas/Editar2.mxml. Agora para abrir a janela, adicionamos uma escuta ao evento customizado, como vemos abaixo.

Arquivo main2.mxml
private function editar():void
{
    var janela:Editar=PopUpManager.createPopUp( this, Editar, true ) as Editar;
    janela.init( dgFiltro.selectedItem )
    janela.addEventListener( CustomEvent.SALVOU, eventSalvou )
}
private function eventSalvou( e:CustomEvent ):void
{
    Alert.show( 'Usuário Salvou o cadastro do ' + e.nome + '!' )
}

Agora quando despachamos o Evento, despachamos com o mesmo nome, e a este evento populamos todas as variáveis da classe CustomEvent.

Arquivo com/kraus/janelas/Editar2.mxml
private function Salvar():void
{
    var evento:CustomEvent = new CustomEvent( CustomEvent.SALVOU )
    evento.nome = tiNome.text
    evento.telefone = tiTelefone.text
    evento.email = tiEmail.text
    dispatchEvent( evento )
    Fechar();
}

Bom, agora voltamos ao arquivo main2.mxml e vamos analizar.

private function editar():void
{
    var janela:Editar=PopUpManager.createPopUp( this, Editar, true ) as Editar;
    janela.init( dgFiltro.selectedItem )
    janela.addEventListener( CustomEvent.SALVOU, eventSalvou )
}
private function eventSalvou( evt:CustomEvent ):void
{
    Alert.show( 'Usuário Salvou o cadastro do ' + evt.nome + '!' )
}

Quando abrimos a janela adicionamos uma escuta e quando executado invoca a função eventSalvou. Nesta função, recebemos como parâmetro os valores preenchidos na edição. Ou seja, a variavel evt possui todas as propriedades definidas dentro da classe Editar2. Veja como ficou a mudança.

Então aprendemos que os eventos são muitos úteis e que eles quebram um tremendo galho na programação.

Os fontes estão disponíveis aqui.

Gostou? Não esqueça de curtir!

Ou compartilhe o link com seus amigos

Compartilhar no Facebook Compartilhar no Google + Compartilhar no Twitter Compartilhar no LinkedIn

7 comentários

  1. Marcos Chi

    Parabens pelo post...

    Muito Utíl essas rotinas...

    Abraços!!!

  2. GuiSjlender

    Uowwww.... matou a pau! hehehe

    Parabéns, muito bom!

    Até mais
    Abraços
    Fuimi

  3. MARIO VEDDER

    eu tenho 1 duvida... tenho 1 datagrid onde estao listados alguns alunos, gostaria de quando eu clicar no aluno eu trazer os dados desse aluno, mas no lugar da primeira datagrid... exemplo datagrid1 --> ALUNO1,ALUNO2,... quando eu clicar no aluno aparece a grid com as informaçoes dele existe como ?

  4. villas

    Muito bom como sempre mas não vai rolar um grid exatamente assim só que salvando e editando no MySQL?

  5. Eduardo Kraus

    @Villas é só submeter para o PHP usando o Zend_Amf ou o AmfPPHP

  6. Cristiane

    Oi Eduardo, parabéns pelo post! me ajudou bastante!
    Obrigada.

Deixe uma resposta