Flex數(shù)據(jù)綁定中綁定到函數(shù)、對(duì)象和數(shù)組
本文和大家重點(diǎn)討論一下Flex數(shù)據(jù)綁定中如何綁定到函數(shù)、對(duì)象和數(shù)組,F(xiàn)lex數(shù)據(jù)綁定是將一個(gè)對(duì)象中的數(shù)據(jù)同另一個(gè)對(duì)象中的數(shù)據(jù)聯(lián)系在一起的過(guò)程。
Flex數(shù)據(jù)綁定
1.綁定到函數(shù)、對(duì)象和數(shù)組
(1)綁定函數(shù)以響應(yīng)Flex數(shù)據(jù)綁定事件
可以把使用“不可綁定的參數(shù)”的函數(shù)作為Flex數(shù)據(jù)綁定表達(dá)式的源。但是,必須有一種辦法能夠激活這個(gè)函數(shù)以更新Flex數(shù)據(jù)綁定的目的屬性。
在下面的例子中,使用了[Bindable]元數(shù)據(jù)標(biāo)記來(lái)指定Felx調(diào)用isEnabled()函數(shù)以響應(yīng)myFlagChanged事件。當(dāng)myFlag的setter方法被調(diào)用時(shí),它就發(fā)出了一個(gè)myFlagChanged事件,這個(gè)事件觸發(fā)任何使用isEnabled()函數(shù)作為源的Flex數(shù)據(jù)綁定。
- <?xmlversionxmlversion="1.0"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml">
- <![CDATA[
- importflash.events.Event;
- //Defineafunctionthatgetsinvoked
- //inresponsetothemyFlagChangedevent.
- [Bindable(event="myFlagChanged")]
- privatefunctionisEnabled():String{
- if(myFlag)
- return'true';
- else
- return'false';
- }
- privatevar_myFlag:Boolean=false;
- //Defineasettermethodthatdispatchesthe
- //myFlagChangedeventtotriggerthedatabinding.
- publicfunctionsetmyFlag(value:Boolean):void{
- _myFlag=value;
- dispatchEvent(newEvent("myFlagChanged"));
- }
- publicfunctiongetmyFlag():Boolean{
- return_myFlag;
- }
- ]]>
#p# (2)將對(duì)象用于Flex數(shù)據(jù)綁定
當(dāng)使用對(duì)象進(jìn)行工作時(shí),不得不考慮什么時(shí)候定義到這個(gè)對(duì)象的綁定?或者考慮什么時(shí)候定義一個(gè)到這個(gè)對(duì)象屬性的綁定?
綁定到對(duì)象
當(dāng)使一個(gè)對(duì)象成為Flex數(shù)據(jù)綁定表達(dá)式的源時(shí),F(xiàn)lex數(shù)據(jù)綁定發(fā)生在這個(gè)對(duì)象被更新之時(shí),或者這個(gè)對(duì)象的引用被更新之時(shí),但不能發(fā)生在這個(gè)對(duì)象的單個(gè)(數(shù)據(jù))域(feild)被更新之時(shí)。
下面的范例中,創(chuàng)建了Object類(lèi)的子類(lèi),這個(gè)子類(lèi)帶有兩個(gè)屬性,stringProp和intProp,但沒(méi)有使這兩個(gè)屬性成為可綁定屬性:
- packagemyComponents
- {
- //binding/myComponents/NonBindableObject.as
- //Makenoclasspropertiesbindable.
- publicclassNonBindableObjectextendsObject{
- publicfunctionNonBindableObject(){
- super();
- }
- publicvarstringProp:String="Stringproperty";
- publicvarintProp:int=52;
- }
- }
因?yàn)檫@個(gè)類(lèi)的兩個(gè)屬性不是可綁定屬性,當(dāng)它們被更新時(shí)Flex不會(huì)發(fā)出事件去觸發(fā)Flex數(shù)據(jù)綁定。接下來(lái)在Flex應(yīng)用中使用這個(gè)類(lèi),如下面的范例所示:
- <?xmlversionxmlversion="1.0"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"
- creationComplete="initObj();">
- <![CDATA[
- importmyComponents.NonBindableObject;
- [Bindable]
- publicvarmyObj:NonBindableObject=newNonBindableObject();
- [Bindable]
- publicvaranotherObj:NonBindableObject=
- newNonBindableObject();
- publicfunctioninitObj():void{
- anotherObj.stringProp='anotherObject';
- anotherObj.intProp=8;
- }
- ]]>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.stringProp"
- click="myObj.stringProp='newstring';"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.intProp"
- click="myObj.intProp=10;"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj"
- click="myObj=anotherObj;"/>
因?yàn)闆](méi)有使NonBindableObject類(lèi)的單個(gè)數(shù)據(jù)域(fields)成為可綁定屬性,所以應(yīng)用在兩個(gè)Text控件的綁定在應(yīng)用啟動(dòng)時(shí)以及在myObj被更新時(shí)才會(huì)被更新。在編譯這個(gè)應(yīng)用時(shí),編譯器會(huì)輸出警告信息,提示Flex數(shù)據(jù)綁定機(jī)制不能檢測(cè)stringProp和intProp屬性的變化。
#p#(3)綁定到對(duì)象的屬性
為了使對(duì)象的屬性可綁定,要?jiǎng)?chuàng)建新的類(lèi)定義,如下面的范例所示:
- packagemyComponents
- {
- //binding/myComponents/BindableObject.as
- //Makeallclasspropertiesbindable.
- [Bindable]
- publicclassBindableObjectextendsObject{
- publicfunctionBindableObject(){
- super();
- }
- publicvarstringProp:String="Stringproperty";
- publicvarintProp:int=52;
- }
- }
通過(guò)在類(lèi)定義之前放置[Bindable]元數(shù)據(jù)標(biāo)記,就可以使得類(lèi)中所有public變量、以及所有完全具備setter及getter的public屬性成為可綁定的屬性。接下來(lái)就可以使用stringProp和intProp屬性作為Flex數(shù)據(jù)綁定的源,如下范例所示:
- <?xmlversionxmlversion="1.0"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"
- creationComplete="initObj();">
- <![CDATA[
- importmyComponents.BindableObject;
- [Bindable]
- publicvarmyObj:BindableObject=newBindableObject();
- [Bindable]
- publicvaranotherObj:BindableObject=
- newBindableObject();
- publicfunctioninitObj():void{
- anotherObj.stringProp='anotherObject';
- anotherObj.intProp=8;
- }
- ]]>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.stringProp"
- click="myObj.stringProp='newstring';"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.intProp"
- click="myObj.intProp=10;"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj"
- click="myObj=anotherObj;"/>
#p# (4)在綁定中使用數(shù)組
在使用數(shù)組進(jìn)行工作時(shí),比如Array或者ArrayCollection對(duì)象,可以把數(shù)組作為Flex數(shù)據(jù)綁定表達(dá)式的源或目的。
注意:當(dāng)使用數(shù)組作為綁定源時(shí),應(yīng)該使用ArrayCollection類(lèi)型的數(shù)組,因?yàn)锳rrayCollection類(lèi)在數(shù)組或數(shù)組元素發(fā)生變化時(shí)能夠發(fā)出事件來(lái)觸發(fā)Flex數(shù)據(jù)綁定。比如,對(duì)ArrayCollection.addItem(),ArrayCollection.addItemAt(),ArrayCollection.removeItem(),以及ArrayCollection.removeItemAt()方法的調(diào)用都會(huì)觸發(fā)Flex數(shù)據(jù)綁定。
綁定到數(shù)組
通常將數(shù)組綁定給Flex控件的dataProvider屬性,下面范例說(shuō)明將數(shù)組綁定用于List控
件:
- <?xmlversionxmlversion="1.0"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml">
- <![CDATA[
- importmx.collections.ArrayCollection;
- [Bindable]
- publicvarmyAC:ArrayCollection=newArrayCollection([
- "One","Two","Three","Four"]);
- [Bindable]
- publicvarmyAC2:ArrayCollection=newArrayCollection([
- "Uno","Dos","Tres","Quatro"]);
- ]]>
- <mx:Button
- label="ChangeElement"
- click="myAC[0]='modOne'"/>
- <mx:Button
- label="AddElement"
- click="myAC.addItem('newelement');"/>
- <mx:Button
- label="RemoveElement0"
- click="myAC.removeItemAt(0);"/>
- <mx:Button
- label="ChangeArrayCollection"
- click="myAC=myAC2"/>
這個(gè)例子定義了一個(gè)ArrayCollection對(duì)象,然后將List控件的dataProvider屬性設(shè)置為對(duì)這個(gè)ArrayCollection的Flex數(shù)據(jù)綁定。當(dāng)修改ArrayCollection對(duì)象中的元素,或者修改對(duì)ArrayCollection對(duì)象的引用,都會(huì)觸發(fā)Flex數(shù)據(jù)綁定。
綁定到數(shù)組中的元素
可以使用數(shù)組中的單個(gè)元素作為Flex數(shù)據(jù)綁定源,如下例所示:
- <?xmlversionxmlversion="1.0"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml">
- <![CDATA[
- importmx.collections.ArrayCollection;
- [Bindable]
- publicvarmyAC:ArrayCollection=newArrayCollection([
- "One","Two","Three","Four"]);
- [Bindable]
- publicvarmyAC2:ArrayCollection=newArrayCollection([
- "Uno","Dos","Tres","Quatro"]);
- ]]>
- <mx:Buttonidmx:Buttonid="button1"
- label="ChangeElement"
- click="myAC[0]='newOne'"/>
- <mx:Buttonidmx:Buttonid="button2"
- label="ChangeArrayCollection"
- click="myAC=myAC2"/>
如果通過(guò)方括號(hào)語(yǔ)法[]來(lái)指定數(shù)組元素作為Flex數(shù)據(jù)綁定表達(dá)式的源,那么Flex數(shù)據(jù)綁定只在應(yīng)用啟動(dòng)時(shí)觸發(fā),或者在數(shù)組或其引用被更新時(shí)觸發(fā)。當(dāng)這個(gè)數(shù)組元素被更新的時(shí)候不會(huì)觸發(fā)Flex數(shù)據(jù)綁定。
但Flex數(shù)據(jù)綁定表達(dá)式中的myAC.getItemAt(0)則會(huì)在該數(shù)組元素變化時(shí)被觸發(fā)更新。因此,id為text2的Text控件在點(diǎn)擊button1時(shí)會(huì)被更新,而id為text1的Text控件則不會(huì)被更新。
當(dāng)使用數(shù)組中的元素作為Flex數(shù)據(jù)綁定表示的源時(shí),應(yīng)當(dāng)在綁定表達(dá)式中使用ArrayCollection.getItemAt()方法。
點(diǎn)擊button2時(shí)將myAC2拷貝給myAC,這會(huì)觸發(fā)對(duì)數(shù)組元素的所有Flex數(shù)據(jù)綁定而不論它們是如何實(shí)現(xiàn)的。
【編輯推薦】
- 技術(shù)分享 在ActionScript中如何定義Flex數(shù)據(jù)綁定
- Adobe Flex提供三種方法指定Flex數(shù)據(jù)綁定
- 術(shù)語(yǔ)匯編 Flex數(shù)據(jù)綁定概述
- 解析Flex全屏模式設(shè)置方法
- Flex內(nèi)存泄露解決方法和內(nèi)存釋放優(yōu)化原則