Domanda

In alcuni casi, non riesco a ottenere componenti per ricevere eventi.

[modifica]

Per chiarire, il codice di esempio è solo a scopo dimostrativo, quello che stavo davvero chiedendo era se ci fosse una posizione centrale in cui un ascoltatore potesse essere aggiunto, a cui si possono inviare in modo affidabile eventi da e verso oggetti arbitrari.

Ho finito per usare parentApplication per inviare e ricevere l'evento che dovevo gestire.

[/ modifica]

Se due componenti hanno genitori diversi, o come nell'esempio seguente, uno è un popup, sembrerebbe che l'evento non raggiunga mai l'ascoltatore (per il dispatch che non funziona, vedi il metodo "popUp"):

<?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>

Posso pensare a soluzioni alternative, ma sembra che ci dovrebbe essere un autobus per eventi centrale ...

Mi manca qualcosa?

È stato utile?

Soluzione

Sopra è corretto. Stai inviando l'evento da btnMenu, ma non stai ascoltando eventi su btnMenu - stai ascoltando eventi sull'applicazione.

Spedizione dall'applicazione:

dispatchEvent(new Event("stepchild", true));

o ascolta sul btnMenu

btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));

Altri suggerimenti

Stai collegando l'ascoltatore a this quando l'evento viene inviato da btnMenu .

Questo dovrebbe funzionare:

dispatchEvent(new Event("stepchild", true));

ps. Non c'è davvero motivo di inserire ovunque un " this " inutile, a meno che non sia esplicitamente richiesto per superare i problemi relativi all'ambito. In questo caso puoi semplicemente lasciare fuori ogni this .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top