当前位置: > > > Flex组件添加到TitleWindow后自动触发removedFromStage事件

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);
}
评论0