0

我一直在分派一个事件,但我无法在主应用程序中检测到它。我敲了一个代码示例,删除了多余的东西,所以它看起来有点不寻常!

我有一个主应用程序(Air),它有一个带有单个按钮的画布。这个单一的按钮打开一个弹出标题窗口,其中有一个数据网格。单击数据网格时,将调度一个非常简单的自定义事件,该事件在最低级别听到,但不调用画布或主应用程序。我假设它是我如何在上层定义听众的,但这真的让我发疯!下面的代码:

主应用程序.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);

}

您正在创建一个最低级别的实例并为此添加一个事件侦听器。但是,这与在 middleLevel 中创建的实例不同。如果您有两个独立的组件实例;在一个实例中分派事件不会导致另一个实例上的事件侦听器触发。

由于您的 mainApp 的最低级别实例永远不会以任何方式添加到舞台;用户永远无法与触发事件进行交互。

你可以试试这个:

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

这将在 mainApp 文件中添加事件侦听器。随着事件的冒泡;该事件在显示层次结构中的每个类上调度。所以,这应该有效。

我看到的第二个问题是 PopUpManager 将其窗口创建为SystemManager组件的子组件;它独立于当前的显示层次结构。引用文档

所有弹出窗口都由 SystemManager 提供。

因此,从最低级别调度事件不会冒泡到 middleLevel 或 mainApp,因为它实际上不是“最低级别”。它几乎就像它存在于并行层次结构中一样。

解决方案是直接在 middleLevel 的最低级别实例上侦听事件并重新调度它。

于 2013-09-09T12:17:28.430 回答