Flex popup的陷阱

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值