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

你可能感兴趣的:(Flex popup的陷阱)