设置:我的Flex应用程序是由多个“子应用程序”组成的应用程序。基本上,主应用程序区域是ApplicationControlBar,其中包含每个子应用程序的按钮。该区域的其余部分是显示子应用程序的画布。一次只能看到一个子应用程序。在子应用程序之间切换时,我们执行canvas.removeAllChildren(),然后执行canvas.addChild(subAppSwitchedTo)。它本质上是一个ViewStack的手动实现(其优缺点不是这个的主题,所以不要对此进行评论)。
问题:在我的一个子应用程序中(假设是子应用程序“A”),我有一个搜索功能,其中结果显示在一个弹出的TitleWindow中。工作流程就像输入搜索条件,单击搜索按钮,TitleWindow弹出结果(多选数据网格),选择所需的结果,单击确定,弹出消失(PopUpManager.removePopUp),然后继续工作。一切正常。问题是如果我切换到另一个子应用程序(例如“B” - 其中A得到 removeAllChildren ()'并且B被添加),然后将切换回到A并再次搜索,当结果TitleWindow弹出打开时,会有 TWO 堆叠在一起。如果我继续导航并返回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);
答案 0 :(得分:1)
我的猜测是,当您删除其父级(PopUpManager.addPopup()方法中的 this )时,弹出窗口将从主显示列表中删除,但不会从其父显示列表中删除。为什么不在子应用程序中监听Event.REMOVED事件,然后删除弹出窗口?那将是:
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;
}
}
答案 1 :(得分:1)
感谢那些提出建议的人。事实证明我一遍又一遍地重新注册了一个eventListener。
我使用singleton充当子应用程序之间的“共享内存”。我在子应用A的 creationComplete 回调中设置singleton.addEventListener(someType, listener)
。因此,每次我导航回A时, creationComplete 都在运行并重新添加此侦听器。搜索之后,多次调用侦听器方法(打开弹出窗口),即添加事件的次数。