Frage

In bestimmten Fällen kann ich nicht Komponenten scheinen zu bekommen Ereignisse zu erhalten.

[Bearbeiten]

Um zu klären, der Beispielcode ist nur zu Demonstrations willen, was ich wirklich frage, war, ob es eine zentrale Lage war, die ein Zuhörer hinzugefügt werden könnte, zu denen man zuverlässig Ereignisse auslösen kann und von beliebigen Objekten.

Ich landete mit parent das Ereignis versenden und empfangen ich zu handhaben benötigt.

[/ edit]

Wenn zwei Komponenten unterschiedlich Eltern haben, oder wie im folgende Beispiel ein ein Popup ist, wäre es das Ereignis scheint nie den Hörer erreicht (siehe Methode „popUp“ für den Versand, die nicht funktioniert):

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

Ich kann von Umgehungen denken, aber es scheint, wie es sollte einige zentrale Ereignis Bus sein ...

Bin ich etwas fehlt?

War es hilfreich?

Lösung

Oben ist richtig. Sie sind das Ereignis aus btnMenu Disposition, aber sie sind nicht für die Ereignisse auf btnMenu hören -. Sie Ereignisse über die Anwendung hören

So oder Versand von Anwendung:

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

oder hören auf dem btnMenu

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

Andere Tipps

Sie sind Anbringen des Hörers this, wenn das Ereignis von btnMenu versandt zu werden.

Dies sollte funktionieren:

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

ps. Es gibt wirklich keinen Grund, eine unnötige ‚this‘ überall zu setzen, es sei denn, es explizit zu überwinden Umfang Probleme erforderlich ist. In diesem Fall können Sie einfach jeden this auslassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top