Flex根据组件id字符串获取组件对象

有这样一个需求:假如你new了一百次Button,同时这些button的id分别赋值如btn1.id = "button1"; btn2.id = "button2";以此类推。当100个button建立后,我想直接对其第20个button进行操作,那么应该如何实现呢?本文将介绍如何在Flex直接获取某个组件的对象。

[size=small][b]Flex中直接获取某个组件的对象方案1:[/b][/size]

遍历这些button所在的容器,然后通过getElementAt()这样的方式获取。
这是常规的做法,这种做法的弊端:每次都需要遍历100次button,显然效率很慢。

[size=small][b]Flex中直接获取某个组件的对象方案2:[/b][/size]

[b]当建立新的button后,将这个button存放到哈希表里面,其键-值的设定关系:key = button.id; value = button;即键里面保存的button的id,而value里面保存的button对象。object[ 'button20' ] = btn20;[/b]

在使用的时候,直接取得第20个button的做法:var button : Button = object[ 'button' + 20 ];

这样做无疑要比第一种方式快很多倍,但是这种做法的弊端:需要建立一个哈希表,当你的数据过多的时候,无疑这个哈希表将会很大。

[size=medium][b]Flex中直接获取某个组件的对象方案3:[/b][/size]
[b]所有的组件都会在document中,不用管父组件,直接用this肯定能取到,debug看一下this里的对象就知道了[/b]。
我们第一不需要遍历100次button容器,第二不需要建立一个哈希表。我们只是用this[xxxx]的方式,即可取出第20个button。

具体做法:[b]var button : Button = this[ 'button' + 20 ][/b];即可完成操作。无论这些button在什么地方?在什么样深度的容器里面,只要是它仍在这个project里面,就可以使用this[xxx]的方式取出。
无疑这种做法是高效的,其实我们仔细看一下this[xxx]其实也是使用哈希表的方式,只不过比方案2好在,我们不需要再建立一个哈希表,这样能节省很多的内存空间。

具体请看一下第三种方法的demo:

<?xml version="1.0" encoding="utf-8"?>
<!-- @author shilei, corporation YD -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
private var newFontStyle:String;
private var newFontSize:int;

public function changeStyle( s : String ) : void {
s = "button" + s;
this[ s ].setStyle( "fontSize", 20 );
}
]]>
</fx:Script>
<mx:Button id="button1" click="changeStyle('2')" label="Button 1" />
<mx:Button id="button2" click="changeStyle('1')" label="Button 2" />
</s:Application>

[b]第三种方法的弊端是只能获取编译时创建的组件,不能获取运行时用代码动态创建的组件,这时候只能通过第一和第二种方法才可以获取组件对象。[/b]

From http://developer.51cto.com/art/200907/136258.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值