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:
-
<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:
-
<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 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”;
[...] using myComp.addEventListener(…), the handler must wait only one event parameter. So Beck came up with a solution, but he stated that this is just one “alternative” solution, not the better [...]
[...] 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 [...]
[...] 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 [...]

