加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex popup的陷阱

发布时间:2020-12-15 04:22:56 所属栏目:百科 来源:网络整理
导读:以下是一个PopupWindow中的一段: ? ? ? ? ? private function closeWindow(e:CloseEvent):void { ? ? ? ? ? ? ? PopUpManager.removePopUp(e.target as IFlexDisplayObject); ? ? ? ? ? } ? ? ? ? ? public function initAll():void { ? ? ? ? ? ? ? this.s

以下是一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读