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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top