Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Flex弹出窗口_Actionscript 3_Apache Flex_Flex4_Air - Fatal编程技术网

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