Passando parâmetros para Event Handlers além do Event?

Outro dia o André Gil da DClick surgiu com uma pergunta interessante: Existe uma maneira de passar parâmetros para um Event Handler a não ser o Event? A resposta para esta pergunta é não. Mas embora a minha resposta para a pergunta tenha sido não, existe sim uma solução alternativa para o problema como mostrarei neste post.

Para exemplificar, o André precisava de algo mais ou menos assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%"
    initialize="initApp()">

    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;

            private function initApp():void
            {
                buttonA.addEventListener(MouseEvent.CLICK, buttonHandler);
                buttonB.addEventListener(MouseEvent.CLICK, buttonHandler);
            }

            private function buttonHandler(event:MouseEvent):void
            {
                // Pega a informação de acordo com o Botão que
                // disparou o evento
            }
        ]]>
    </mx:Script>

    <mx:Button id="buttonA" label="Button A"/>
    <mx:Button id="buttonB" label="Button B"/>

</mx:Application>

O trecho comentado no exemplo acima é o trecho sem solução e a solução alternativa para o problema pode ser vista no exemplo a seguir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%"
    initialize="initApp()">

    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;

            private function initApp():void
            {
                MouseEvent[buttonA.id] = "This is the button A";
                MouseEvent[buttonB.id] = "This is the button B";

                buttonA.addEventListener(MouseEvent.CLICK, buttonHandler);
                buttonB.addEventListener(MouseEvent.CLICK, buttonHandler);
            }

            private function buttonHandler(event:MouseEvent):void
            {
                Alert.show(MouseEvent[event.currentTarget.id]);
            }
        ]]>
    </mx:Script>

    <mx:Button id="buttonA" label="Button A"/>
    <mx:Button id="buttonB" label="Button B"/>

</mx:Application>

Como toda classe é um objeto dinâmico (public dynamic class Class) você pode atribuir métodos e propriedades dinamicamente às classes. É o que foi feito no exemplo acima onde duas propriedades cujos nomes correspondem aos ids dos componentes foram criadas na classe MouseEvent. Creio que o restante do código seja auto-explicativo.

Agora a pergunta que não quer calar: seria este mais uma pattern do Freaktionscript?


7 comentários

  1. Marcelo Savioli em 29.nov.07 às 7:42 pm

    Interessante Beck.. mas perigoso, muito!

  2. Beck Novaes em 1.dez.07 às 9:34 am

    Ah sim… mas tudo todo pattern o candidato a pattern do Freaktionscript é perigoso. :-)
    []‘s

  3. Richard em 17.jan.08 às 7:34 am

    Pode-se também recuperar o objeto dentro do buttonHandler:

    var currentButton:Button = e.currentTarget as Button;

    e assim usar suas propriedades como necessário:

    currentButton.text = “Exemplo”;

Trackbacks

  1. DClick Blog
  2. André Gil's Blog » Passing parameters to Event handlers
  3. Passando parâmetros para Event Handlers – Parte 2 | DClick Team Weblog [pt]
  4. Passando parâmetros para Event Handlers – Parte 2 - redeRIA | Agregador de noticias, artigos, tutoriais Flex, Flash, JavaFX, AJAX e Rich internet applications em geral!

Deixe Seu Comentário