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
Interessante Beck.. mas perigoso, muito!
Ah sim… mas tudo todo pattern o candidato a pattern do Freaktionscript é perigoso.
[]‘s
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
Deixe Seu Comentário