0

イベントがディスパッチされてトラウマを抱えていますが、メインのアプリでは検出できません。コードの例をノックアップして、冗長なものを削除したので、少し変わったように見えます!

ボタンが1つあるキャンバスを持つメインアプリ(Air)があります。この単一のボタンは、データグリッドを含むポップアップ タイトル ウィンドウを開きます。データグリッドをクリックすると、非常に単純なカスタム イベントがディスパッチされます。これは最下位レベルで聞こえますが、キャンバスやメイン アプリは呼び出されません。上位レベルでリスナーを定義する方法だと思いますが、それは本当に私を怒らせています! 以下のコード:

mainApp.mxml........

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
                                        layout="absolute"
                                        creationComplete="{onCreationComplete()}" 
                                        xmlns:components="components.*"
                                         >

<mx:Script>
    <![CDATA[

        import components.lowestLevel;

        private var lowest:lowestLevel;

        private  function onCreationComplete():void
        {
                 lowest = new lowestLevel;

                 lowest.addEventListener('myEventType',mainAppListenerHandler);

        }


        private function mainAppListenerHandler(event:Event):void
        {
            trace("ive been heard  in main app")
        }   

    ]]>

</mx:Script>

        <components:middleLevel/>

</mx:WindowedApplication>

ミドルレベル.mxml

<?xml version="1.0" encoding="utf-8"?>
    <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
                    width="900" 
                    height="50"
                    creationComplete="{ addEventListener('myEventType',listenerHandler);}"
                    >

    <mx:Script>
        <![CDATA[
            import mx.core.Application;
            import mx.managers.PopUpManager;
            import actionScript.sql;

            private function launchViewAllLoads(event:MouseEvent):void
            {            

                sql.getSourceFilesToView()

                var win:lowestLevel = new lowestLevel();

                PopUpManager.addPopUp(win,parent,true);
                PopUpManager.centerPopUp(win); 

            }

            private function listenerHandler(event:Event):void
            {
                trace("im heard at the Middle level" )      
            }           

]]>


    </mx:Script>

    <mx:Button  id="btnViewAllLoads"
                        label="View Current"
                        click="{launchViewAllLoads(event)};"
                         />

    </mx:Canvas>

最低レベル.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" width="800" height="550"
    title="View All Loads" horizontalAlign="center"
    creationComplete="{ addEventListener('myEventType',listenerHandler);}"
      >

    <mx:Script>
        <![CDATA[

            import mx.core.IFlexDisplayObject;
            import mx.events.CloseEvent;
            import mx.managers.PopUpManager;


            private function listenerHandler(event:Event):void
            {
                trace("im heard at the lowest level" )      
            }


            private function sourceFilesToViewClickedHandler():void
            {   
                PopUpManager.removePopUp(this as IFlexDisplayObject);

                var myEvent:Event = new Event('myEventType' ,true,true);
                dispatchEvent(myEvent); 

            }

        ]]>
    </mx:Script>

        <mx:Canvas  id="cSourceFiles" width = "100%" height="100%">

                <mx:DataGrid    id="dgSourceFiles"  
                                        click="{sourceFilesToViewClickedHandler()}">

                <mx:columns>
                    <mx:DataGridColumn dataField="Batch"  headerText="Batch" width="80"/>
                    <mx:DataGridColumn dataField="LastUpdated"  headerText="Last Updated" width="85"/>                                  
                </mx:columns>

            </mx:DataGrid>


        </mx:Canvas>
</mx:TitleWindow>
4

2 に答える 2

0

同じイベントを再ディスパッチするとどうなりますか:

private function listenerHandler(event:Event):void {
    trace("im heard at the Middle level" )      
    dispatchEvent(event);
}

コールバックを使用して:

var callback = function():void {
   // do some stuff here
}
lowest = new lowestLevel(callback);

その後、イベントをディスパッチする代わりに:

private var _callback:Function;
public function lowestLevel(callback:Function):void {
  _callback = callback;
}
private function sourceFilesToViewClickedHandler():void {   
  PopUpManager.removePopUp(this as IFlexDisplayObject);
  _callback();
}
于 2013-09-09T10:49:45.687 に答える
0

ここにいくつかの問題があります。まず、mainApp.mxml に次のように記述します。

private  function onCreationComplete():void
{
         lowest = new lowestLevel;

         lowest.addEventListener('myEventType',mainAppListenerHandler);

}

lowerLevel のインスタンスを作成し、これにイベント リスナーを追加しています。ただし、これは middleLevel で作成されたインスタンスと同じではありません。コンポーネントの 2 つの独立したインスタンスがある場合。1 つのインスタンスでイベントをディスパッチしても、他のインスタンスのイベント リスナーは起動しません。

mainApp の lowerLevel インスタンスは、どのような方法でもステージに追加されることはありません。ユーザーは、イベントを発生させて操作することはできません。

これを試すことができます:

private  function onCreationComplete():void
{
         this.addEventListener('myEventType',mainAppListenerHandler);
}

これにより、mainApp ファイルにイベント リスナーが追加されます。イベントが泡立つように。イベントは、表示階層内のすべてのクラスでディスパッチされます。したがって、これは機能するはずです。

2 つ目の問題は、PopUpManager がそのウィンドウをSystemManagerコンポーネントの子として作成することです。これは、現在の表示階層とは無関係です。ドキュメントを引用するには:

すべてのポップアップは SystemManager によって親にされます。

したがって、lowestLevel からイベントをディスパッチしても、実際には「最下位レベル」ではないため、middleLevel または mainApp にはバブルしません。並列階層に存在するのとほぼ同じです。

解決策は、middleLevel の lowerLevel インスタンスで直接イベントをリッスンし、それを再ディスパッチすることです。

于 2013-09-09T12:17:28.430 に答える