Passando parâmetros para Event Handlers – Parte 2

Ano passasdo perguntei ao Beck como passar parâmetros para Event Handlers adicionados dinamicamente, porque quando você adiciona Event Listener usando myComp.addEventListener(…), o handler deve esperar apenas o parâmetro do evento. O Beck deu uma solução para isso, mas deixou claro que é apenas uma solução “alternativa”, não a melhor delas.

Alguns dias atrás eu estava trabalhando com requisições simultâneas para o servidor e queria guardar o parâmetro da chamada, mas não queria ter que retornar ele do Java, então pensei em uma outra solução para isso. Considerando que seu Event Handler está esperando uma Function que tem somente um parâmetro Event, eu criei uma outra Function que retorna uma Function esperando um parâmetro Event. Mas o segredo é que o escopo de Function Closure permite que você acesse parâmetros tanto da primeira quanto da segunda Function, então você pode fazer isso:

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
29
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" height="100%" width="100%"
    initialize="initApp()">

    <mx:Script>
        <![CDATA[
            private function initApp():void
            {
                buttonA.addEventListener(MouseEvent.CLICK, buttonHandler(0x0000FF));
                buttonB.addEventListener(MouseEvent.CLICK, buttonHandler(0xFF0000));
            }

            private function buttonHandler(color:uint):Function
            {
                return function(event:MouseEvent):void
                {
                    box.setStyle("backgroundColor", color);
                }
            }
        ]]>
    </mx:Script>

    <mx:HBox>
        <mx:Button id="buttonA" label="Blue"/>
        <mx:Button id="buttonB" label="Red"/>
    </mx:HBox>

    <mx:Box id="box" height="80" width="200" backgroundColor="#FFFFFF"/>

</mx:Application>


Mas e agora se você quiser usar esse Event Handler diretamente no MXML? Bem, você não pode fazer isso:

1
<mx:Button label="Green" click="buttonHandler(0x00FF00)"/>


Isso não vai funcionar porque a Function que retorna da primeira Function está esperando um parâmetro Event. Então, você pode fazer assim:

1
<mx:Button label="Green" click="buttonHandler(0x00FF00)(event)"/>


Estranho, não? Talvez mais um patter do FreaktionScript?


7 comentários

  1. Rafaelsc em 19.jan.10 às 9:21 am

    Cool Teste

  2. Rafael Martinelli em 19.jan.10 às 9:30 am

    Muito bom!!!!

  3. Nelson Vasconcelos em 19.jan.10 às 3:17 pm

    Freak Total! Muito bom mesmo =D

  4. Henrique F. Marino em 19.jan.10 às 6:14 pm

    Muito loco meu veio!

  5. Beck Novaes em 19.jan.10 às 9:36 pm

    André “o oráculo” Gil é o seu nome já há algum tempo :-)

    []‘s
    Beck Novaes

  6. Ricardo Ramires em 19.jan.10 às 10:39 pm

    Eu costumava fazer assim:

    button.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void { buttonHandler(event, “valor”) });

    private function buttonHandler(event:MouseEvent, prop1:String):void
    {
    trace(prop1);
    }

    Da no mesmo mas da maneira do André fica mais limpo o código.
    ;-)

  7. Felipe Mesquita em 22.jan.10 às 6:29 pm

    Valeu andré você é o cara…. ;)

Deixe Seu Comentário