DClick

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:

XML:
  1. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
  2.     width="100%" height="100%"
  3.     initialize="initApp()">
  4.    
  5.     <mx:Script>
  6.         <![CDATA[
  7.             import mx.controls.Alert;
  8.  
  9.             private function initApp():void
  10.             {
  11.                 buttonA.addEventListener(MouseEvent.CLICK, buttonHandler);
  12.                 buttonB.addEventListener(MouseEvent.CLICK, buttonHandler);
  13.             }
  14.            
  15.             private function buttonHandler(event:MouseEvent):void
  16.             {
  17.                 // Pega a informação de acordo com o Botão que
  18.                 // disparou o evento
  19.             }
  20.         ]]>
  21.     </mx:Script>
  22.    
  23.     <mx:Button id="buttonA" label="Button A"/>
  24.     <mx:Button id="buttonB" label="Button B"/>
  25.        
  26. </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:

XML:
  1. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
  2.     width="100%" height="100%"
  3.     initialize="initApp()">
  4.    
  5.     <mx:Script>
  6.         <![CDATA[
  7.             import mx.controls.Alert;
  8.  
  9.             private function initApp():void
  10.             {
  11.                 MouseEvent[buttonA.id] = "This is the button A";
  12.                 MouseEvent[buttonB.id] = "This is the button B";
  13.                
  14.                 buttonA.addEventListener(MouseEvent.CLICK, buttonHandler);
  15.                 buttonB.addEventListener(MouseEvent.CLICK, buttonHandler);
  16.             }
  17.            
  18.             private function buttonHandler(event:MouseEvent):void
  19.             {
  20.                 Alert.show(MouseEvent[event.currentTarget.id]);
  21.             }
  22.         ]]>
  23.     </mx:Script>
  24.    
  25.     <mx:Button id="buttonA" label="Button A"/>
  26.     <mx:Button id="buttonB" label="Button B"/>
  27.        
  28. </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?

Por Beck Novaes em 29/November/2007 | Comentar | Trackback


No Translations

4 comentários para “Passando parâmetros para Event Handlers além do Event?”


Interessante Beck.. mas perigoso, muito!


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


[...] A pergunta B apresenta uma definição mais genérica do problema, e por possuir um escopo maior a possibilidade de encontrar uma solução também é maior. Ao tomar a pergunta A como problema a ser resolvido nós acabamos esbarrando em uma limitação do modo de funcionamento de eventos do ActionScript que gera automaticamente o único parâmetro do Event Handler que é o objeto Event. Mas como o problema, de fato, é melhor explicito na pergunta B existe uma solução como pode ser visto neste outro post. [...]


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”;

Adicionar comentário

(requerido)
(requerido, não será publicado)