Flex: ¿Por qué no puedo manejar ciertos eventos?
-
02-07-2019 - |
Pregunta
En ciertos casos, parece que no puedo obtener componentes para recibir eventos.
[editar]
Para aclarar, el código de ejemplo es solo para fines de demostración, lo que realmente preguntaba era si había una ubicación central en la que se pudiera agregar un oyente, a la que se puedan enviar eventos de manera confiable desde y hacia objetos arbitrarios.
Terminé usando parentApplication para enviar y recibir el evento que necesitaba manejar.
[/ edit]
Si dos componentes tienen padres diferentes, o como en el ejemplo a continuación, uno es una ventana emergente, parece que el evento nunca llega al oyente (Vea el método '' popUp '' para el envío que no 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>
Puedo pensar en soluciones, pero parece que debería haber algún bus de eventos central ...
¿Me estoy perdiendo algo?
Solución
Arriba es correcto. Está enviando el evento desde btnMenu, pero no está escuchando eventos en btnMenu, está escuchando eventos en la Aplicación.
Cualquier envío desde la aplicación:
dispatchEvent(new Event("stepchild", true));
o escuche en el btnMenu
btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
Otros consejos
Está adjuntando el oyente a this
cuando el evento se envía desde btnMenu
.
Esto debería funcionar:
dispatchEvent(new Event("stepchild", true));
ps. Realmente no hay razón para poner un ' this
innecesario en todas partes, a menos que sea explícitamente necesario para superar los problemas de alcance. En este caso, puede dejar todo this
fuera.