11.10.在State Changes事件中添加和删除事件监听器

11.10.1. 问题
我想给State 中创建添加的组件注册事件监听器,当state 改变时移除监听器。
11.10.2. 解决办法
将事件监听器关联到组件的addedToStage 事件,在removedFromStage 事件中移除事件监听器。或者使用SetEventHandler 对象创建事件监听器。
11.10.3. 讨论
在ActionScript3中确保事件处理器能被正确的移除是保证应用程序不会造成消耗Flash Player 大量内存的最好方法。也就是说,添加事件处理器也就伴随着要移除这些事件处理器。

例如在组件被添加或移除时也要添加和移除事件处理器:
+展开
-XML
<mx:AddChild relativeTo="{holder}">
<mx:TextInput text="TEXTid="textInput1width="200"
addedToStage="{textInput1.addEventListener(TextEvent.TEXT_INPU
T, checkNewTextInput)}
"
removedFromStage="{textInput2.addEventListener( TextEvent.TEXT
_INPUT, checkNewTextInput) }
" />

</mx:AddChild>

使用SetEventHandler 对象也能完成同样的功能,它接受一个事件处理器相关联的目标。

handlerFunction 指定事件处理器名称:
+展开
-XML
<mx:SetEventHandler handlerFunction="checkNewTextInputname="{TextEvent.TEXT_INPUT}target="{textInput2}"/>

当用户改变state 时事件处理器就会被添加和删除。这个可以通过把事件监听器改为Event.ENTER_FRAME 来的已确认何时监听器被添加和移除。完整代码如下:
+展开
-XML
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxmlwidth="400height="300">
<mx:Script>
<![CDATA[
private function checkNewTextInput(event:Event):void
{
trace(" event "+event.target);
}

]]>
</mx:Script>
<mx:states>
<mx:State id="openStatename="openState">
<mx:AddChild relativeTo="{holder}">
<mx:TextInput text="TEXTid="textInput1"
width="200"
addedToStage="{textInput1.addEventListener(TextEv
ent.TEXT_INPUT, checkNewTextInput)}
"
removedFromStage="{textInput2.addEventListener
(TextEvent.TEXT_INPUT, checkNewTextInput)}
"/>

</mx:AddChild>
</mx:State>
<mx:State id="closedStatename="closedState">
<mx:SetEventHandler handlerFunction="checkNewTextInput"
name="{TextEvent.TEXT_INPUT}target="{textInput2}"/>

<mx:AddChild relativeTo="{holder}">
<mx:TextInput id="textInput2width="200"
text="MORE TEXT"/>

</mx:AddChild>
</mx:State>
</mx:states>
<mx:VBox id="holder">
<mx:Button click="(this.currentState == 'openState') ?
currentState='closedState' : currentState='openState'
label="change"/>

</mx:VBox>
</mx:Canvas>

加支付宝好友偷能量挖...


评论(0)网络
阅读(80)喜欢(0)flash/flex/fcs/AIR