Флекс: Почему я не могу справиться с определенными событиями? - PullRequest
2 голосов
/ 25 сентября 2008

В некоторых случаях я не могу получить компоненты для получения событий.

[редактировать]

Чтобы пояснить, пример кода просто для демонстрации, я действительно спрашивал, было ли центральное место, куда можно добавить слушателя, к которому можно надежно отправлять события в и из произвольных объектов.

В итоге я использовал parentApplication для отправки и получения события, которое мне нужно было обработать.

[/ править]

Если два компонента имеют разных родителей или, как в примере ниже, один из них является всплывающим окном, может показаться, что событие никогда не достигнет слушателя (см. Метод «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>

Я могу думать об обходных путях, но кажется, что должна быть какая-то центральная шина событий ...

Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2008

выше правильно. Вы отправляете событие из btnMenu, но не прослушиваете события в btnMenu - вы прослушиваете события в Приложении.

Любая отправка из приложения:

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

или слушайте на btnMenu

btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
0 голосов
/ 25 сентября 2008

Вы присоединяете слушателя к this, когда событие отправляется из btnMenu.

Это должно работать:

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

пс. В действительности нет повода ставить ненужные «this» везде, если только это явно не требуется для преодоления проблем с областью действия В этом случае вы можете просто пропустить каждый this.

...