Flexコンポーネントid文字列からコンポーネントオブジェクトを取得


もしあなたが100回Buttonをnewしたら、これらのbuttonのidはそれぞれbtn 1のように値を与えます.id = "button1"; btn2.id = "button2";このように推す.100個のbuttonが確立された後、20個目のbuttonを直接操作したいのですが、どのように実現すればいいのでしょうか.ここでは、Flexでコンポーネントのオブジェクトを直接取得する方法について説明します.
Flexでコンポーネントを直接取得するオブジェクトスキーム1:
これらのbuttonが存在するコンテナを巡り、getElementAt()のように取得します.
これは従来のやり方で、このやり方の弊害:毎回100回buttonを遍歴する必要があり、明らかに効率が遅い.
Flexでコンポーネントを直接取得するオブジェクトスキーム2:
新しいbuttonが確立されると、このbuttonをハッシュテーブルに格納し、そのキー値の設定関係:key=button.id; value = button;すなわち,キーに保存されたbuttonのid,valueに保存されたbuttonオブジェクトである.object[ 'button20' ] = btn20;
使用する場合、20番目のbuttonを直接取得する方法:var button:Button=object['button'+20];
このようにすると、最初の方法よりも何倍も速くなるに違いありませんが、このようなやり方の弊害は、ハッシュテーブルを構築する必要があります.データが多すぎると、このハッシュテーブルが大きくなるに違いありません.
Flexでコンポーネントを直接取得するオブジェクトスキーム3:
すべてのコンポーネントはdocumentにあります.親コンポーネントを気にせず、thisで直接取り出すことができます.debugはthisのオブジェクトを見てください.
最初は100回buttonコンテナを巡回する必要はありません.2番目はハッシュテーブルを構築する必要はありません.私たちはthis[xxxx]の方法で、20番目のbuttonを取り出すことができます.
具体的な方法:
var button : Button = this[ 'button' + 20 ];を選択します.これらのbuttonはどこにありますか?どのような深さの容器の中で、それがまだこのプロジェクトの中にある限り、this[xxx]の方法で取り出すことができます.
この方法は効率的であることは間違いありませんが、実際にはthis[xxx]をよく見てみると、ハッシュテーブルを使用する方法でもあります.ただし、シナリオ2よりも優れています.ハッシュテーブルを作成する必要はありません.これにより、多くのメモリスペースを節約できます.
具体的には、3つ目の方法の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>

第3の方法の弊害は、コンパイル時に作成されたコンポーネントのみを取得でき、実行時にコードで動的に作成されたコンポーネントを取得できないことであり、この場合、第1および第2の方法でのみコンポーネントオブジェクトを取得することができる.
From http://developer.51cto.com/art/200907/136258.htm