以下是一个PopupWindow中的一段:
????? private function closeWindow(e:CloseEvent):void {
??????? PopUpManager.removePopUp(e.target as IFlexDisplayObject);
????? }
????? public function initAll():void {
??????? this.systemManager.addEventListener(CONFIRM_DELETE,confirmDeleteBumen);
????? }
看似正确,一开始运行起来也正常,但是却隐藏了严重的Bug.
??????? 一次又一次的执行PopupManager.addPopup(popWindow),然后点击将其关闭,几次以后就发现运行开始混乱。trace后发现,dispatchEvent() CONFIRM_DELETE一次,而confirmDeleteBumen被执行多次!而且每次加一,越来越多。看以上代码马上怀疑,addEventListener被执行多次,而关闭时并没有被释放。
??????? 反复验证后确实如此,为什么以前没有出现这个问题呢?原来一直使用PureMvc,而PureMvc所有的DisplayComponent都是用ApplicationFacade来唯一注册的。也就是说它们不会被initialize第二次,也就不会出现EventListener被注册多次的问题了。
?????? 但Popup是自己控制的,所以必须遵循以下两点:
?????? 1.? 必须保证Popup关闭时,EventListener被remove
?????? 2.? Popup关闭只能有一个出口
以上代码改为:
????? private function closeWindow(e:CloseEvent):void {
??????? PopUpManager.removePopUp(e.target as IFlexDisplayObject);
??????? this.systemManager.removeEventListener(CONFIRM_DELETE,confirmDeleteBumen);
????? }
????? public function initAll():void {
??????? this.systemManager.addEventListener(CONFIRM_DELETE,confirmDeleteBumen);
????? }
关闭Popup的动作(比如说关闭按钮)都应该使用:dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
转载:http://blog.sina.com.cn/s/blog_538d55be0100ibu9.html