溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Flex數(shù)據(jù)綁定中使用Bindable元數(shù)據(jù)標(biāo)記的方式有哪些

發(fā)布時(shí)間:2021-12-04 14:03:58 來(lái)源:億速云 閱讀:99 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)Flex數(shù)據(jù)綁定中使用Bindable元數(shù)據(jù)標(biāo)記的方式有哪些的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

Flex數(shù)據(jù)綁定

使用Bindable元數(shù)據(jù)標(biāo)記

當(dāng)屬性成為Flex數(shù)據(jù)綁定表達(dá)式源時(shí),F(xiàn)lex在源屬性發(fā)生變化時(shí)自動(dòng)將源屬性的值拷貝給目的屬性。為了告知Flex去執(zhí)行這個(gè)拷貝工作,必須用[Bindable]元數(shù)據(jù)標(biāo)記將這個(gè)屬性注冊(cè)到Flex中,并且源屬性必須發(fā)出一個(gè)事件。

[Bindable]元數(shù)據(jù)標(biāo)記語(yǔ)法如下:

[Bindable]  [Bindable(event="eventname")]

如果忽略事件名稱,F(xiàn)lex會(huì)自動(dòng)創(chuàng)建一個(gè)名為propertyChange,類型為PropertyChangeEvent的事件??梢栽谌齻€(gè)地方使用[Bindable]元數(shù)據(jù)標(biāo)記:

1.在public類定義之前使用。

在這個(gè)地方使用[Bindable]元數(shù)據(jù)標(biāo)記使得類中定義的全部public變量以及同時(shí)具有setter和getter方法的public屬性能成為Flex數(shù)據(jù)綁定表達(dá)式的源。這種情況下,[Bindable]不使用任何參數(shù),如下例所示:

[Bindable]  publicclassTextAreaFontControlextendsTextArea{}

Flex編譯器自動(dòng)為所有public屬性生成名為propertyChange,類型為PropertyChangeEvent的事件,以使這些屬性可以被用于Flex數(shù)據(jù)綁定表達(dá)式的源。
如果對(duì)屬性進(jìn)行寫操作的時(shí)候?qū)傩灾当3植蛔?,F(xiàn)lex不會(huì)發(fā)出事件或者更新屬性,這里判斷屬性是否不同可以翻譯為如下的檢測(cè)語(yǔ)句:
(oldValue!==value)
這意味著,如果屬性包含了一個(gè)對(duì)象引用,并且引用被更改為引用了一個(gè)不同但是等價(jià)的對(duì)象,那么綁定也會(huì)被觸發(fā)。如果屬性沒(méi)有被改變,而它所指向的對(duì)象在內(nèi)部發(fā)生了變化,那么綁定不會(huì)被觸發(fā)。
注意:在publicclass定義之前使用[Bindable]元數(shù)據(jù)標(biāo)記只是將綁定作用于public屬性,它不會(huì)作用于private和protected屬性以及那些定義在其他namespace中的屬性。必須在非public屬性前插入[Bindable]元數(shù)據(jù)標(biāo)記,才能使之成為Flex數(shù)據(jù)綁定表達(dá)式的源。

2.在public,protected或者private屬性之前使用該標(biāo)記可以將這個(gè)特定的屬性定義為支持Flex數(shù)據(jù)綁定。

標(biāo)記可以有以下的形式:

[Bindable]  publicvarfoo:String;


Flex編譯器自動(dòng)為那個(gè)屬性產(chǎn)生名為propertyChange,類型為PropertyChangeEvent的事件,如果寫入的屬性值不變,F(xiàn)lex不會(huì)發(fā)出事件或者更新屬性。也可以在[Bindable]元數(shù)據(jù)標(biāo)記中指定事件名,如下的例子所示:

[Bindable(event="fooChanged")]  publicvarfoo:String;


這種情況下,開發(fā)者要自己負(fù)責(zé)產(chǎn)生和發(fā)出事件,通常在類的其他方法中完成這些工作。盡管在類的級(jí)別上指定了[Bindable]標(biāo)記,如果想要為事件命名,仍然可以在[Bindable]中包含指定名稱的事件。

3.在由getter或者setter方法所定義的public,protected或者private屬性之前使用該標(biāo)記。

這種情況下,要想使用[Bindable]標(biāo)記必須為屬性同時(shí)定義setter和getter方法。如果只是定義了一個(gè)setter方法,那么你就創(chuàng)建了一個(gè)“只寫”屬性,這樣的屬性不能作為Flex數(shù)據(jù)綁定表達(dá)式的源。如果只定義getter方法,那么就創(chuàng)建了一個(gè)“只讀”屬性,把只讀屬性當(dāng)作Flex數(shù)據(jù)綁定源而不插入[Bindable]標(biāo)記,就如同使用了一個(gè)用const關(guān)鍵字定義的變量來(lái)作為Flex數(shù)據(jù)綁定表達(dá)式的源。(這樣的綁定源只能在應(yīng)用啟動(dòng)時(shí)觸發(fā)綁定一次,以后就不會(huì)再觸發(fā))。

這個(gè)標(biāo)記可以由下面的形式定義:

[Bindable]  publicfunctionsetshortNames(val:Boolean):void{  ...  }  publicfunctiongetshortNames():Boolean{  ...  }

Flex編譯器自動(dòng)為這個(gè)屬性產(chǎn)生一個(gè)名為propertyChange,類型為PropertyChangeEvent的事件。如果屬性值在寫入的時(shí)候保持不變,F(xiàn)lex不會(huì)發(fā)出事件或者更新屬性。為了確定屬性是否變化,F(xiàn)lex調(diào)用getter方法來(lái)獲取屬性的當(dāng)前值。

也可以為事件指定名稱,如下例所示:

[Bindable(event="changeShortNames")]  publicfunctionsetshortNames(val:Boolean):void{  ...  //Createanddispatchevent.  dispatchEvent(newEvent("changeShortNames"));  }  //Getmethod.  publicfunctiongetshortNames():Boolean{  ...  }

這種情況下,開發(fā)者要負(fù)責(zé)生成和發(fā)出事件。通常是在setter方法中完成這個(gè)工作。
并且Flex不會(huì)檢查舊值和新值是否不同。盡管在類的級(jí)別上指定了[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)記中引入了屬性變化時(shí)由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);  }

在這個(gè)例子中,setter更新了屬性的值,然后創(chuàng)建并發(fā)出了一個(gè)事件來(lái)激發(fā)對(duì)Flex數(shù)據(jù)綁定目的屬性的更新。
在MXML文件中,通過(guò)在<mx:Metadata>塊中引入[Bindable]元數(shù)據(jù)標(biāo)記,就可以將所有以變量形式定義的public屬性成為Flex數(shù)據(jù)綁定的源,例子如下:

<mx:Metadata> [Bindable]  </mx:Metadata>


在<mx:Script>塊中也可以在使用[Bindable]元數(shù)據(jù)標(biāo)記使單個(gè)的變量形式定義的屬性成為Flex數(shù)據(jù)綁定表達(dá)式的源。另外,也可以對(duì)setter及getter方法定義的屬性使用[Bindable]元數(shù)據(jù)標(biāo)記,使之成為Flex數(shù)據(jù)綁定表達(dá)式的源。

◆將只讀屬性作為Flex數(shù)據(jù)綁定的源

使用getter方法而沒(méi)有setter就可以自動(dòng)定義一個(gè)只讀屬性作為Flex數(shù)據(jù)綁定表達(dá)式的源。
Flex只在應(yīng)用啟動(dòng)時(shí)執(zhí)行一次Flex數(shù)據(jù)綁定。因?yàn)閬?lái)自于只讀屬性的Flex數(shù)據(jù)綁定只在應(yīng)用啟動(dòng)時(shí)發(fā)生一次,所以可以對(duì)只讀屬性省略[Bindable]元數(shù)據(jù)標(biāo)記。

◆用靜態(tài)屬性作為Flex數(shù)據(jù)綁定源

可以將靜態(tài)屬性作為Flex數(shù)據(jù)綁定表達(dá)式的源,F(xiàn)lex在應(yīng)用啟動(dòng)時(shí)執(zhí)行一次Flex數(shù)據(jù)綁定,然后在靜態(tài)屬性發(fā)生變化的時(shí)候再執(zhí)行Flex數(shù)據(jù)綁定。
可以將靜態(tài)常量自動(dòng)作為Flex數(shù)據(jù)綁定表達(dá)式的源,F(xiàn)lex只在應(yīng)用啟動(dòng)時(shí)執(zhí)行一次Flex數(shù)據(jù)綁定。因?yàn)镕lex數(shù)據(jù)綁定只在應(yīng)用啟東時(shí)發(fā)生一次,所以可以對(duì)靜態(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)指定一個(gè)屬性作為Flex數(shù)據(jù)綁定表達(dá)式的源時(shí),F(xiàn)lex不僅監(jiān)控這個(gè)屬性的變化,也會(huì)監(jiān)控這個(gè)由這個(gè)屬性作為開始點(diǎn)的屬性鏈的變化。整個(gè)屬性鏈,包括源屬性,被稱為“可綁定的屬性鏈”。在下面的例子中,firstName.text是一個(gè)可綁定的屬性鏈:
<mx:Textid="myText"text="{firstName.text}"/>
開發(fā)者可以使用很長(zhǎng)的屬性鏈,如下例所示:

<mx:Textidmx:Textid="myText"text="{user.name.firstName.text}"/>


只有當(dāng)text屬性是可綁定的,F(xiàn)lex數(shù)據(jù)綁定機(jī)制才能檢查text屬性的變化。但是,如果在運(yùn)行時(shí),想要向?qū)傩枣溨械牟糠謱傩再x予新值,那么屬性鏈中的每個(gè)屬性都必須是可綁定的,才能使Flex數(shù)據(jù)綁定機(jī)制起作用。否則,在運(yùn)行時(shí)更改user,name或者firstName屬性會(huì)導(dǎo)致Flex數(shù)據(jù)綁定機(jī)制無(wú)法檢查text屬性的變化。

在使用BindingUtils.bindProperty()或者BindingUtils.bindSetter()方法時(shí),可以將可綁定的屬性鏈作為方法的參數(shù),例如,bindProperty()方法有以下的聲明:
publicstaticfunctionbindProperty(site:Object,prop:String,host:Object,chain:Object,commitOnly:Boolean=false):ChangeWatcherHost和chain屬性指定了Flex數(shù)據(jù)綁定表達(dá)式的源。使用bindProperty()方法可以定義一個(gè)Flex數(shù)據(jù)綁定表達(dá)式,如下:

bindProperty(myText,'text',user,["name","firstName","text"]);

這個(gè)例子中,["name","firstName","text"]定義了相對(duì)于user對(duì)象的可綁定屬性鏈。注意,在本例中,user不是可綁定屬性鏈的一部分。

在MXMLFlex數(shù)據(jù)綁定表達(dá)式中,可綁定屬性連總是相對(duì)于this。因此,要想定義一個(gè)同上面的MXML等價(jià)的Flex數(shù)據(jù)綁定表達(dá)式,應(yīng)按如下例子使用bindProperty()方法:
bindProperty(myText,'text',this,["user","name","firstName","text"]);

感謝各位的閱讀!關(guān)于“Flex數(shù)據(jù)綁定中使用Bindable元數(shù)據(jù)標(biāo)記的方式有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI