Cairngorm XXX命令被执行多次

时间:2009-10-08 02:23:42

标签: flex cairngorm

我遇到了一个问题。我正在使用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);
    ...
}

有人能帮我一把吗?

非常感谢!

最佳,硕

3 个答案:

答案 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);
     }

}