我遇到了一个问题。我正在使用flex进行GIS程序。
我的应用程序中有一个地图,当我点击地图上的一个图标时,windowA弹出,当我点击windowA里面的链接时,windowB弹出,但是我的问题出来了,当我关闭windowB并点击链接时在窗口内另一次,两个windowB弹出......
在我的窗口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);
...
}
有人能帮我一把吗?
非常感谢!
最佳,硕
答案 0 :(得分:1)
第一
// Shouldn't this be in a FrontController class?
addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);
我认为您必须以某种方式调用PopupManager.removePopup,因为Flex 3 ActionScript引用声明:
弹出一个顶级窗口。最好调用removePopUp()来删除使用addPopUp()方法创建的弹出窗口。如果该类实现了IFocusManagerContainer,则该窗口将具有自己的FocusManager,这样,如果用户使用TAB键在控件之间导航,则只会访问窗口中的控件
答案 1 :(得分:1)
WindowBControl是否继承自FrontController?如果是这样,你可能会在事故中不止一次地实例化它。这个:
<control:WindowBControl id='control1'>
将创建此前端控制器的实例。由于您已将这行代码放在WindowA中,因此每次创建WindowA的新实例时,您都将创建此控制器的新实例。这将导致每次事件触发时为每个控制器实例调用一次命令。
你应该只实例化前控制器,你只会在一次实例化它们。 mxml的主要应用程序是一个很好的地方。
答案 2 :(得分:0)
我找到了另一种解决方案。
在windowA的结束方法中,我写了
private function onClose():void
{
PopUpManager.removePopUp(this);
if(CairngormEventDispatcher.getInstance().hasEventListener(WindowBControl.EVENT_POPUPWindowB))
{
control1.removeCommand(WindowBControl.EVENT_POPUPWindowB);
}
}