2

場合によっては、コンポーネントにイベントを受信させることができないようです。

[編集]

明確にするために、サンプルコードはデモンストレーション用です。私が本当に尋ねていたのは、リスナーを追加できる中央の場所があり、そこに任意のオブジェクトとの間でイベントを確実にディスパッチできるかどうかでした。

最終的に、parentApplicationを使用して、処理する必要のあるイベントをディスパッチおよび受信しました。

[/編集]

2つのコンポーネントの親が異なる場合、または以下の例のように、1つがポップアップの場合、イベントがリスナーに到達しないように見えます(機能しないディスパッチについては、メソッド「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>

回避策は考えられますが、中央のイベントバスがあるはずです...

私は何かが足りないのですか?

4

2 に答える 2

2

上は正しいです。btnMenu からイベントをディスパッチしていますが、btnMenu でイベントをリッスンしていません。アプリケーションでイベントをリッスンしています。

アプリケーションからのいずれかのディスパッチ:

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

または btnMenu で聞く

btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
于 2008-09-25T12:34:01.997 に答える
0

thisイベントが からディスパッチされるときに、リスナーを にアタッチしていますbtnMenu

これはうまくいくはずです:

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

ps。thisスコープの問題を克服するために明示的に必要な場合を除き、不必要な ' ' をどこにでも置く理由はありません。この場合、すべてthisを除外することができます。

于 2008-09-25T01:43:49.907 に答える