Flex组件添加到TitleWindow后自动触发removedFromStage事件
今天发现个奇怪的事情。写了个组件,这个组件内部添加了个removedFromStage事件的响应,用来移除时做一些清理工作。在程序运行时,我先创建了个TitleWindow,然后把这个组件add进来,然后弹出。可是弹出时居然会触发这个组件的removedFromStage事件。
故障原因:这个问题困扰了我很久,后来翻墙在google上才找到原因。Container类里面有一个方法叫createContentPane()。它是在添加滚动条之前调用。它创建了个FlexSprite类型的contentPane,然后把所有的子对象添加进来,同时调用所有的子对象的parentChanged()方法。这样结果就是所有子对象的removedFromStage和addedToStage事件都被触发了。(但目前我就发现TitleWindow有这个情况,其他容器暂时没发现)
解决办法:我们可以在removedFromStage事件响应方法里增加个判断,判断父容器的creatingContentPane属性是否为true,为true的话说明父容器在创建contentPane,而不是该组件真正的从舞台中移除。
private function removedFromStageHandler(event:Event):void { var parent:Container = this.parent as Container; while(parent != null){ if(parent.creatingContentPane == true){ return; } parent = parent.parent as Container; } //这下面写正常的业务逻辑,如清理页面等 this.removeAllChildren(); removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler); }