我跑进一个problem.I'm使用Flex做一个地理信息系统。

有一个在我的应用程序映射,当我点击地图上的一个图标,窗口A弹出,当我点击内部窗口A纽带,窗口B弹出,但在这里我的问题出来了,当我关闭窗口B,并点击链接另一时间内窗口A,窗口B的两个弹出...

在我的窗口A,我

...
var windowBEvt:WindowBEvent = new WindowBEvent();
CairngormEventDispatcher.getInstance().dispatchEvent(windowBEvt);
...
<control:WindowBControl id='control1'>

在WindowBControl,我

addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);

在WindowBCommand,我

public function execute(event:CairngormEvent):void
{
    ...
    var windowB:WindowB = new WindowB();
    PopUpManager.addPopUp(windowB);
    ...
}

谁能给我个忙吗?

许多谢谢!

最佳,硕

有帮助吗?

解决方案

是否从WindowBControl继承FrontController?如果是的话,你可能将其实例化不止一次事故更多。这样:

<control:WindowBControl id='control1'>

时,将创建该前端控制器的一个实例。既然你已经把此行的代码窗口A,你会在每次创建窗口A的新实例时创建该控制器的新实例。然后这将导致在被调用一次,每次您的事件触发所述控制器的每一个实例的命令。

您应该只实例化前端控制器,你是积极的,他们只会被实例化一次。主要应用的mxml是一个很好的地方。

其他提示

第一

// Shouldn't this be in a FrontController class?
addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);

我认为你必须以某种方式调用PopupManager.removePopup因为Flex 3的ActionScript参考状态:

  

弹出一个顶层窗口。这是很好的调用removePopUp()来删除使用addPopUp()方法创建的弹出窗口。如果该类实现了IFocusManagerContainer,窗口将具有其自己的FocusManager使得,如果用户使用TAB键控件之间导航,只有在窗口中的控制将被访问

我找到另一种解决方案。

在窗口A的收盘方法,我写

private function onClose():void
{
     PopUpManager.removePopUp(this);
     if(CairngormEventDispatcher.getInstance().hasEventListener(WindowBControl.EVENT_POPUPWindowB))
     {
         control1.removeCommand(WindowBControl.EVENT_POPUPWindowB);
     }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top