Adobe Flex PopUpManager语言 - 多个实例的标题窗口打开



Setup:我的Flex应用程序是由几个"子应用程序"组成的。基本上,主应用区域是一个ApplicationControlBar,每个子应用都有按钮。其余区域是显示子应用程序的画布。一次只有一个子应用可见。当在子应用之间切换时,我们执行canvas.removeAllChildren(),然后执行canvas.addChild(subAppSwitchedTo)。它本质上是一个手动实现的ViewStack(其利弊不是这个主题,所以不要评论这个)。

问题:在我的一个子应用程序(让我们说子应用程序"A"),我有一个搜索功能,其中结果显示在标题窗口得到弹出。工作流就像输入搜索条件,点击搜索按钮,标题窗口弹出结果(多个选择数据网格),选择所需的结果,点击确定,弹出窗口消失(PopUpManager.removePopUp),然后继续工作。这一切都很好。问题是,如果我切换到不同的子应用程序(说"B"-其中a得到removeAllChildren()'d和B被添加),然后切换回到到a并再次搜索,当结果TitleWindow弹出时,将有两个堆叠在彼此的顶部。如果我继续导航并返回到A,每次我搜索时,都会在弹出窗口的"堆栈"中出现一个额外的弹出窗口(每次A获得addChild()'d)。

其他人有过这样的经历吗?我不知道该怎么做,它在我的应用程序中造成了严重的可用性错误。有人想起来了吗?这就像我不知何故需要冲洗PopUpManager或其他东西(即使我正确地调用removePopUp()来删除TitleWindow)。请帮助!


编辑

Flex SDK = 4.5.1

// Subapp "A"
if (!certificateSearchTitleWindow)
{
  certificateSearchTitleWindow = new CertificateSearchTitleWindow;
  certificateSearchTitleWindow.addEventListener("searchAccept", searchOKPopupHandler);
  certificateSearchTitleWindow.addEventListener("searchCancel", searchClosePopupHandler);
}
PopUpManager.addPopUp(certificateSearchTitleWindow, this, true);

我的猜测是,弹出是从主显示列表中删除,当你删除它的父(这个在PopUpManager.addPopup()方法),但不是从它的父显示列表。你为什么不在你的子程序里,听一下事件呢。事件,然后删除你的弹出窗口?那就是:

private var pp:CertificateSearchTitleWindow;
private function onCreationComplete():void
{
    addEventListener(Event.REMOVED, onRemovede);
}
private function addPopUp():void
{
    if (!pp) {
        pp = new CertificateSearchTitleWindow();
        PopUpManager.addPopUp(pp, this, true);
    }
}
private function onRemoved(event:Event):void
{
    if (pp) {
        PopupManager.removePopUp(pp);
        pp = null;
    }
}

感谢那些提出建议的人。原来我是一遍又一遍地重新注册一个eventListener。

我使用一个单例作为子应用程序之间的"共享内存"。我在子应用程序A的creationComplete回调中设置singleton.addEventListener(someType, listener)。所以每次我导航回A时,creationComplete正在运行并重新添加这个侦听器。在搜索之后,侦听器方法(打开弹出窗口的方法)被多次调用,也就是说,与事件被添加的次数一样多。

xref: http://forums.adobe.com/message/3941163

最新更新