Flex: Por que não pode lidar com certos eventos?
-
02-07-2019 - |
Pergunta
Em certos casos, eu não posso parecer para obter componentes para receber eventos.
[editar]
Para esclarecer, o código de exemplo é apenas para demonstração bem, o que eu estava realmente perguntando era se havia um local central que um ouvinte pode ser adicionado, a que se pode despachar confiável eventos de e para objetos arbitrários.
Acabei usando parentApplication para expedição e receber o evento que eu precisava para alça.
[/ edit]
Se dois componentes têm pais diferentes, ou como no exemplo abaixo, é um pop-up, ao que parece o evento nunca atinge o ouvinte (Veja o método de "Pop-up" para o despacho que não funciona):
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="init()">
<mx:Script>
<![CDATA[
import mx.controls.Menu;
import mx.managers.PopUpManager;
// Add listeners
public function init():void
{
this.addEventListener("child", handleChild);
this.addEventListener("stepchild", handleStepchild);
}
// Handle the no pop button event
public function noPop(event:Event):void
{
dispatchEvent(new Event("child"));
}
// Handle the pop up
public function popUp(event:Event):void
{
var menu:Menu = new Menu();
var btnMenu:Button = new Button();
btnMenu.label = "stepchild";
menu.addChild(btnMenu);
PopUpManager.addPopUp(menu, this);
// neither of these work...
this.callLater(btnMenu.dispatchEvent, [new Event("stepchild", true)]);
btnMenu.dispatchEvent(new Event("stepchild", true));
}
// Event handlers
public function handleChild(event:Event):void
{
trace("I handled child");
}
public function handleStepchild(event:Event):void {
trace("I handled stepchild");
}
]]>
</mx:Script>
<mx:VBox>
<mx:Button label="NoPop" id="btnNoPop" click="noPop(event)"/>
<mx:Button label="PopUp" id="btnPop" click="popUp(event)"/>
</mx:VBox>
</mx:Application>
Não consigo pensar em soluções alternativas, mas parece que deveria haver algum ônibus evento central ...
Estou faltando alguma coisa?
Solução
Acima está correto. Você está despachando o evento a partir btnMenu, mas você não está ouvindo eventos no btnMenu -. Você está ouvindo eventos no aplicativo
De qualquer expedição de aplicação:
dispatchEvent(new Event("stepchild", true));
ou ouvir no btnMenu
btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
Outras dicas
Você está anexando o ouvinte a this
quando o evento está sendo despachado de btnMenu
.
Isso deve funcionar:
dispatchEvent(new Event("stepchild", true));
ps. Não há realmente nenhuma razão para colocar um 'this
' desnecessária em todos os lugares, a menos que seja explicitamente necessário para superar as questões de escopo. Neste caso, você pode simplesmente deixar todos fora this
.