Actionscript 3 Flex弹出窗口
我正在父页面中创建模式弹出画布窗口。当我关闭弹出窗口时,如何在父屏幕中得到子弹出窗口刚刚关闭的通知。有任何事件吗?显示弹出窗口的代码:Actionscript 3 Flex弹出窗口,actionscript-3,apache-flex,flex4,air,Actionscript 3,Apache Flex,Flex4,Air,我正在父页面中创建模式弹出画布窗口。当我关闭弹出窗口时,如何在父屏幕中得到子弹出窗口刚刚关闭的通知。有任何事件吗?显示弹出窗口的代码: var popup:MyPopup = new popup:MyPopup(); popup.addEventListener(CloseEvent.CLOSE, function(evt) { PopUpManager.removePopUp(popup); }); PopUpManager.addPopUp(popup, this, true)
var popup:MyPopup = new popup:MyPopup();
popup.addEventListener(CloseEvent.CLOSE, function(evt) {
PopUpManager.removePopUp(popup);
});
PopUpManager.addPopUp(popup, this, true);
在MyPopup
类中,您将有一个关闭弹出窗口的按钮。只需挂接click事件即可发布“CLOSE”事件:
我更喜欢这种机制,而不是让MyPopup
对象调用PopUpManager.removeppopup
(正如@Fank所建议的那样),因为它将MyPopup
组件耦合到我不喜欢的PopUpManager
。我希望MyPopup
的用户决定如何使用该组件
老实说,这是两种非常相似的机制来实现相同的最终目标。是的,有:
我建议使用Popupmanager:
您的弹出窗口:
有一个按钮“关闭”调用一个内部函数,例如closeme
private function closeMe () :void
{
PopUpManager.removePopUp(this);
}
在父级中,您可以按如下方式打开弹出窗口:
private function openPopup () :void
{
var helpWindow:TitleWindow = TitleWindow(PopUpManager.createPopUp(this,MyTitleWindow,fale));
helpWindow.addEventListener(CloseEvent.CLOSE, onClose);
}
protected function onClose (event:CloseEvent) :void
{
PopUpManager.removePopUp (TitleWindow(event.currentTarget));
}
My TitleWindow是由TitleWindow扩展的cour popup类的名称
溴
Frank与Brian的答案一起,不要忘记分离事件侦听器。如果您让主应用程序中的事件处理程序侦听子对象中的事件,则不会对该子对象进行垃圾收集,因为仍有某些对象在引用它。这是一个常见的内存泄漏问题
popup.addEventListener(CloseEvent.CLOSE, popup_CloseHandler);
private function popup_CloseHandler(event:CloseEvent):void{
event.target.removeEventListener(CloseEvent.CLOSE, popup_CloseHandler);
PopUpManager.removePopUp(popup);
}
如果你想深入研究Flex的内存管理,这里有一篇关于Flex内存管理的文章
这对我来说很好,因为我没有使用画布而不是Titlewindow,但你说两者都有相同的最终目标。谢谢。虽然我同意脱钩是一种很好的做法,但在这种情况下,你所说的并不准确。挂接事件时,弹出窗口保留对主机的引用,而不是相反。只要没有其他东西(即PopupManager)保留对弹出窗口的引用,弹出窗口就会被垃圾收集。但是,因为这种关系(世卫组织提到世卫组织)是微妙的,而且经常令人困惑(举个例子),我同意。。。无论何时处理完事件,都要将其取消挂钩。这是一件安全的事情。啊,是的,在第二次看了我写的东西之后,我确实把它倒过来了。谢谢布莱恩指出这一点。在这个例子中,它是不需要的,但我绝对同意你的说法,它总是安全的。
popup.addEventListener(CloseEvent.CLOSE, popup_CloseHandler);
private function popup_CloseHandler(event:CloseEvent):void{
event.target.removeEventListener(CloseEvent.CLOSE, popup_CloseHandler);
PopUpManager.removePopUp(popup);
}