Question

Dans certains cas, je n'arrive pas à faire en sorte que des composants reçoivent des événements.

[edit]

Pour clarifier, l'exemple de code sert uniquement à des fins de démonstration. Ce que je demandais vraiment, c'était s'il existait un emplacement central pour lequel un auditeur pourrait être ajouté, auquel on pourrait envoyer de manière fiable des événements vers et à partir d'objets arbitraires.

J'ai fini par utiliser parentApplication pour envoyer et recevoir l'événement que je devais gérer.

[/ edit]

Si deux composants ont des parents différents ou, comme dans l'exemple ci-dessous, l'un d'eux est un popup, il semblerait que l'événement n'atteigne jamais l'auditeur (voir la méthode "popUp" pour l'envoi qui ne fonctionne pas):

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

Je peux penser à des solutions de rechange, mais il semble qu'il devrait y avoir un bus central pour les événements ...

Est-ce que je manque quelque chose?

Était-ce utile?

La solution

ci-dessus est correct. Vous distribuez l'événement à partir de btnMenu, mais vous n'écoutez pas les événements de btnMenu. Vous écoutez les événements de l'application.

Soit envoi depuis l'application:

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

ou écoutez sur le menu btn

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

Autres conseils

Vous associez l'auditeur à this lorsque l'événement est distribué de btnMenu .

Cela devrait fonctionner:

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

ps. Il n'y a vraiment aucune raison de mettre un ' this ' inutile partout, à moins que cela ne soit explicitement requis pour surmonter les problèmes de périmètre. Dans ce cas, vous pouvez simplement laisser chaque ce .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top