Flex數(shù)據(jù)綁定中使用Bindable元數(shù)據(jù)標(biāo)記的三種方式
本文和大家重點討論一下Flex數(shù)據(jù)綁定,F(xiàn)lex數(shù)據(jù)綁定需要一個源屬性,一個目的屬性,以及用于表明何時將數(shù)據(jù)從源屬性拷貝到目的屬性的觸發(fā)事件。當(dāng)源屬性變化時,對象發(fā)出觸發(fā)事件。
Flex數(shù)據(jù)綁定
使用Bindable元數(shù)據(jù)標(biāo)記
當(dāng)屬性成為Flex數(shù)據(jù)綁定表達(dá)式源時,F(xiàn)lex在源屬性發(fā)生變化時自動將源屬性的值拷貝給目的屬性。為了告知Flex去執(zhí)行這個拷貝工作,必須用[Bindable]元數(shù)據(jù)標(biāo)記將這個屬性注冊到Flex中,并且源屬性必須發(fā)出一個事件。
[Bindable]元數(shù)據(jù)標(biāo)記語法如下:
- [Bindable]
- [Bindable(event="eventname")]
如果忽略事件名稱,F(xiàn)lex會自動創(chuàng)建一個名為propertyChange,類型為PropertyChangeEvent的事件。可以在三個地方使用[Bindable]元數(shù)據(jù)標(biāo)記:
1.在public類定義之前使用。
在這個地方使用[Bindable]元數(shù)據(jù)標(biāo)記使得類中定義的全部public變量以及同時具有setter和getter方法的public屬性能成為Flex數(shù)據(jù)綁定表達(dá)式的源。這種情況下,[Bindable]不使用任何參數(shù),如下例所示:
- [Bindable]
- publicclassTextAreaFontControlextendsTextArea{}
Flex編譯器自動為所有public屬性生成名為propertyChange,類型為PropertyChangeEvent的事件,以使這些屬性可以被用于Flex數(shù)據(jù)綁定表達(dá)式的源。
如果對屬性進(jìn)行寫操作的時候?qū)傩灾当3植蛔儯現(xiàn)lex不會發(fā)出事件或者更新屬性,這里判斷屬性是否不同可以翻譯為如下的檢測語句:
(oldValue!==value)
這意味著,如果屬性包含了一個對象引用,并且引用被更改為引用了一個不同但是等價的對象,那么綁定也會被觸發(fā)。如果屬性沒有被改變,而它所指向的對象在內(nèi)部發(fā)生了變化,那么綁定不會被觸發(fā)。
注意:在publicclass定義之前使用[Bindable]元數(shù)據(jù)標(biāo)記只是將綁定作用于public屬性,它不會作用于private和protected屬性以及那些定義在其他namespace中的屬性。必須在非public屬性前插入[Bindable]元數(shù)據(jù)標(biāo)記,才能使之成為Flex數(shù)據(jù)綁定表達(dá)式的源。
2.在public,protected或者private屬性之前使用該標(biāo)記可以將這個特定的屬性定義為支持Flex數(shù)據(jù)綁定。
標(biāo)記可以有以下的形式:
- [Bindable]
- publicvarfoo:String;
Flex編譯器自動為那個屬性產(chǎn)生名為propertyChange,類型為PropertyChangeEvent的事件,如果寫入的屬性值不變,F(xiàn)lex不會發(fā)出事件或者更新屬性。也可以在[Bindable]元數(shù)據(jù)標(biāo)記中指定事件名,如下的例子所示:
- [Bindable(event="fooChanged")]
- publicvarfoo:String;
這種情況下,開發(fā)者要自己負(fù)責(zé)產(chǎn)生和發(fā)出事件,通常在類的其他方法中完成這些工作。盡管在類的級別上指定了[Bindable]標(biāo)記,如果想要為事件命名,仍然可以在[Bindable]中包含指定名稱的事件。#p#
3.在由getter或者setter方法所定義的public,protected或者private屬性之前使用該標(biāo)記。
這種情況下,要想使用[Bindable]標(biāo)記必須為屬性同時定義setter和getter方法。如果只是定義了一個setter方法,那么你就創(chuàng)建了一個“只寫”屬性,這樣的屬性不能作為Flex數(shù)據(jù)綁定表達(dá)式的源。如果只定義getter方法,那么就創(chuàng)建了一個“只讀”屬性,把只讀屬性當(dāng)作Flex數(shù)據(jù)綁定源而不插入[Bindable]標(biāo)記,就如同使用了一個用const關(guān)鍵字定義的變量來作為Flex數(shù)據(jù)綁定表達(dá)式的源。(這樣的綁定源只能在應(yīng)用啟動時觸發(fā)綁定一次,以后就不會再觸發(fā))。
這個標(biāo)記可以由下面的形式定義:
- [Bindable]
- publicfunctionsetshortNames(val:Boolean):void{
- ...
- }
- publicfunctiongetshortNames():Boolean{
- ...
- }
Flex編譯器自動為這個屬性產(chǎn)生一個名為propertyChange,類型為PropertyChangeEvent的事件。如果屬性值在寫入的時候保持不變,F(xiàn)lex不會發(fā)出事件或者更新屬性。為了確定屬性是否變化,F(xiàn)lex調(diào)用getter方法來獲取屬性的當(dāng)前值。
也可以為事件指定名稱,如下例所示:
- [Bindable(event="changeShortNames")]
- publicfunctionsetshortNames(val:Boolean):void{
- ...
- //Createanddispatchevent.
- dispatchEvent(newEvent("changeShortNames"));
- }
- //Getmethod.
- publicfunctiongetshortNames():Boolean{
- ...
- }
這種情況下,開發(fā)者要負(fù)責(zé)生成和發(fā)出事件。通常是在setter方法中完成這個工作。
并且Flex不會檢查舊值和新值是否不同。盡管在類的級別上指定了[Bindable]標(biāo)記,如果想要為事件命名,仍然可以在[Bindable]中包含指定名稱的事件。
下面的代碼使以變量形式定義的maxFontSize和minFontSize屬性可以作為Flex數(shù)據(jù)綁定的源:
- //Definepublicvarsfortrackingfontsize.
- [Bindable]
- publicvarmaxFontSize:Number=15;
- [Bindable]
- publicvarminFontSize:Number=5;
在下面的例子中,使setter和getter方法形式定義的public屬性成為Flex數(shù)據(jù)綁定的源。
[Bindable]元數(shù)據(jù)標(biāo)記中引入了屬性變化時由setter方法發(fā)出的事件:
- //Defineprivatevariable.
- privatevar_maxFontSize:Number=15;
- [Bindable(event="maxFontSizeChanged")]
- //Definepublicgettermethod.
- publicfunctiongetmaxFontSize():Number{
- return_maxFontSize;
- }
- //Definepublicsettermethod.
- publicfunctionsetmaxFontSize(value:Number):void{
- if(value<=30){
- _maxFontSize=value;
- }else_maxFontSize=30;
- //Createeventobject.
- vareventObj:Event=newEvent("maxFontSizeChanged");
- dispatchEvent(eventObj);
- }
在這個例子中,setter更新了屬性的值,然后創(chuàng)建并發(fā)出了一個事件來激發(fā)對Flex數(shù)據(jù)綁定目的屬性的更新。
在MXML文件中,通過在<mx:Metadata>塊中引入[Bindable]元數(shù)據(jù)標(biāo)記,就可以將所有以變量形式定義的public屬性成為Flex數(shù)據(jù)綁定的源,例子如下:
- <mx:Metadata>
- [Bindable]
- </mx:Metadata>
在<mx:Script>塊中也可以在使用[Bindable]元數(shù)據(jù)標(biāo)記使單個的變量形式定義的屬性成為Flex數(shù)據(jù)綁定表達(dá)式的源。另外,也可以對setter及getter方法定義的屬性使用[Bindable]元數(shù)據(jù)標(biāo)記,使之成為Flex數(shù)據(jù)綁定表達(dá)式的源。#p#
◆將只讀屬性作為Flex數(shù)據(jù)綁定的源
使用getter方法而沒有setter就可以自動定義一個只讀屬性作為Flex數(shù)據(jù)綁定表達(dá)式的源。
Flex只在應(yīng)用啟動時執(zhí)行一次Flex數(shù)據(jù)綁定。因為來自于只讀屬性的Flex數(shù)據(jù)綁定只在應(yīng)用啟動時發(fā)生一次,所以可以對只讀屬性省略[Bindable]元數(shù)據(jù)標(biāo)記。
◆用靜態(tài)屬性作為Flex數(shù)據(jù)綁定源
可以將靜態(tài)屬性作為Flex數(shù)據(jù)綁定表達(dá)式的源,F(xiàn)lex在應(yīng)用啟動時執(zhí)行一次Flex數(shù)據(jù)綁定,然后在靜態(tài)屬性發(fā)生變化的時候再執(zhí)行Flex數(shù)據(jù)綁定。
可以將靜態(tài)常量自動作為Flex數(shù)據(jù)綁定表達(dá)式的源,F(xiàn)lex只在應(yīng)用啟動時執(zhí)行一次Flex數(shù)據(jù)綁定。因為Flex數(shù)據(jù)綁定只在應(yīng)用啟東時發(fā)生一次,所以可以對靜態(tài)常量省略[Bindable]元數(shù)據(jù)標(biāo)記。下面例子使用靜態(tài)常量作為Flex數(shù)據(jù)綁定表達(dá)式的源。
- <?xmlversionxmlversion="1.0"?>
- <!--binding/StaticBinding.mxml-->
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml">
- <mx:Script>
- <![CDATA[
- //Thissyntaxcasuesacompilererror.
- //[Bindable]
- //publicstaticvarvarString:String="Astaticvar.";
- publicstaticconstconstString:String="Astaticconst.";
- ]]>
- </mx:Script>
- <!--Thisbindingoccursonceatapplicationstartup.-->
- <mx:Buttonlabelmx:Buttonlabel="{constString}"/>
- </mx:Application>
◆使用可綁定屬性鏈進(jìn)行工作
當(dāng)指定一個屬性作為Flex數(shù)據(jù)綁定表達(dá)式的源時,F(xiàn)lex不僅監(jiān)控這個屬性的變化,也會監(jiān)控這個由這個屬性作為開始點的屬性鏈的變化。整個屬性鏈,包括源屬性,被稱為“可綁定的屬性鏈”。在下面的例子中,firstName.text是一個可綁定的屬性鏈:
<mx:Textid="myText"text="{firstName.text}"/>
開發(fā)者可以使用很長的屬性鏈,如下例所示:
- <mx:Textidmx:Textid="myText"text="{user.name.firstName.text}"/>
只有當(dāng)text屬性是可綁定的,F(xiàn)lex數(shù)據(jù)綁定機制才能檢查text屬性的變化。但是,如果在運行時,想要向?qū)傩枣溨械牟糠謱傩再x予新值,那么屬性鏈中的每個屬性都必須是可綁定的,才能使Flex數(shù)據(jù)綁定機制起作用。否則,在運行時更改user,name或者firstName屬性會導(dǎo)致Flex數(shù)據(jù)綁定機制無法檢查text屬性的變化。
在使用BindingUtils.bindProperty()或者BindingUtils.bindSetter()方法時,可以將可綁定的屬性鏈作為方法的參數(shù),例如,bindProperty()方法有以下的聲明:
publicstaticfunctionbindProperty(site:Object,prop:String,host:Object,chain:Object,commitOnly:Boolean=false):ChangeWatcherHost和chain屬性指定了Flex數(shù)據(jù)綁定表達(dá)式的源。使用bindProperty()方法可以定義一個Flex數(shù)據(jù)綁定表達(dá)式,如下:
- bindProperty(myText,'text',user,["name","firstName","text"]);
這個例子中,["name","firstName","text"]定義了相對于user對象的可綁定屬性鏈。注意,在本例中,user不是可綁定屬性鏈的一部分。
在MXMLFlex數(shù)據(jù)綁定表達(dá)式中,可綁定屬性連總是相對于this。因此,要想定義一個同上面的MXML等價的Flex數(shù)據(jù)綁定表達(dá)式,應(yīng)按如下例子使用bindProperty()方法:
bindProperty(myText,'text',this,["user","name","firstName","text"]);
【編輯推薦】
- 學(xué)習(xí)筆記 如何將對象用于Flex數(shù)據(jù)綁定
- Flex數(shù)據(jù)綁定中綁定到函數(shù)、對象和數(shù)組
- 術(shù)語匯編 Flex數(shù)據(jù)綁定概述
- 解析Flex全屏模式設(shè)置方法
- Flex內(nèi)存泄露解決方法和內(nèi)存釋放優(yōu)化原則

















