Flex 2 中的元數(shù)據(jù)標(biāo)簽
——告訴編譯器如何編譯
雖然多數(shù)Flex開發(fā)者都使用過[Bindable]標(biāo)簽,但是很多人都不知道這個(gè)標(biāo)簽的作用甚至不知道該標(biāo)簽為何物。[Bindable]就是所謂的元數(shù)據(jù)標(biāo)簽。元數(shù)據(jù)標(biāo)簽是一種特殊的標(biāo)簽,它在代碼中的作用就是向編譯器提供如何編譯程序的信息。實(shí)際上,這些標(biāo)簽并沒有被編譯到生成的SWF文件中,而只是告訴編譯器如何生成SWF文件。文檔中列出的元數(shù)據(jù)標(biāo)簽共有12個(gè),本文將講解這些元數(shù)據(jù)標(biāo)簽的定義并給出使用它們的示例,在看完這篇文章之后,你就會(huì)明白應(yīng)該在何時(shí)何處在你的Flex 2應(yīng)用程序中使用元數(shù)據(jù)標(biāo)簽了。
[ArrayElementType]實(shí)際上,定義一個(gè)數(shù)組通常來說是一件很平常的事情,因?yàn)閿?shù)組中的元素可以是任何類型的。不過,使用ArrayElementType元數(shù)據(jù)標(biāo)簽可以讓你定義數(shù)組元素的數(shù)據(jù)類型。下面的例子展示了如何使用[ArrayElementType]:
[ArrayElementType("String")]
public var arrayOfStrings:Array;
[ArrayElementType("Number")]
public var arrayOfNumbers:Array;
[ArrayElementType("mx.core.UIComponent")]
public var arrayOfUIComponents:Array;
[Bindable]Bindable元數(shù)據(jù)標(biāo)簽是最經(jīng)常用到的一個(gè)元數(shù)據(jù)標(biāo)簽,因?yàn)樗钩绦蚪M件之間的數(shù)據(jù)同步變得很容易。Bindable可以用來綁定簡(jiǎn)單數(shù)據(jù)類型、類、復(fù)雜數(shù)據(jù)類型以及函數(shù)。綁定數(shù)據(jù)的時(shí)候,你必須先使用元數(shù)據(jù)標(biāo)簽定義一下數(shù)據(jù),正如
Listing 1中所示的那樣。
Bindable也可以用來綁定到事件。
Listing 2展示了如何使用getter和setter函數(shù)將一個(gè)屬性綁定到一個(gè)事件上。這個(gè)例子中有一個(gè)叫做phoneNumber的私有變量,還有一個(gè)公有的setter和getter函數(shù)。使用Bindable標(biāo)簽將這個(gè)getter方法綁定到了一個(gè)叫做phoneNumberChanged的事件上,只要數(shù)據(jù)發(fā)生改變setter方法就會(huì)分派phoneNumberChanged事件。通過使用setter方法,可以在數(shù)據(jù)賦予私有變量之前對(duì)其進(jìn)行操作。在這個(gè)例子中,數(shù)據(jù)只有在長(zhǎng)度大于等于10的時(shí)候才會(huì)被格式化。當(dāng)phoneNumberChanged事件被分派的時(shí)候,第二個(gè)TextInput組件會(huì)被更新,因?yàn)樗膖ext屬性綁定到了phoneNumber變量上。
[DefaultProperty]DefaultProperty元數(shù)據(jù)標(biāo)簽用來將一個(gè)單一屬性設(shè)定為某個(gè)類的默認(rèn)屬性。它允許在一個(gè)容器標(biāo)簽內(nèi)設(shè)定屬性,而不用定義屬性的名字。一個(gè)簡(jiǎn)單的例子就是一個(gè)自定義Button類。
Listing 3展示了一個(gè)簡(jiǎn)單的Button類,它將label屬性設(shè)定為了DefaultProperty。
Listing 4展示了label屬性是如何在自定義Button標(biāo)簽中作為一個(gè)字符串定義的。
[Embed]Embed元數(shù)據(jù)標(biāo)簽用來導(dǎo)入圖片到程序。可以通過兩種方式使用Embed。你可以將圖片嵌入到ActionScript中并將其指派給一個(gè)變量(如同下面代碼中的第一個(gè)例子),或者你也可以將圖片直接指派給組件的屬性(使用下面代碼中的第二個(gè)例子所示的語法規(guī)則)。
例1:[Embed(source="myIcon.gif")]
[Bindable]
public var myIcon:Class;
<mx:Button label="Icon Button 1" icon="{myIcon}"/>
<mx:Button label="Icon Button 2" icon="{myIcon}"/>
例2:<mx:Button label="Icon Button 1" icon="@Embed(source=myIcon.gif‘)"/>
<mx:Button label="Icon Button 2" icon="@Embed(source=myIcon.gif‘)"/>
上面這兩個(gè)例子產(chǎn)生的結(jié)果是一樣的。創(chuàng)建myIcon類的好處是,它在一個(gè)類中只定義一次并可以綁定到程序中的多個(gè)組件。
[Event]Event元數(shù)據(jù)標(biāo)簽用來聲明那些被自定義類分派的事件。將這個(gè)元數(shù)據(jù)標(biāo)簽添加到類定義中之后,你就可以在MXML標(biāo)簽中添加事件處理函數(shù)來初始化該自定義類。
Listing 5創(chuàng)建了一個(gè)自定義Button類,每當(dāng)它的label屬性改變的時(shí)候就會(huì)分派一個(gè)事件。
Listing 6所顯示的主程序文件初始化了這個(gè)自定義Button并創(chuàng)建了事件處理函數(shù),該函數(shù)將新的labe屬性值賦給了一個(gè)TextArea組件以顯示當(dāng)前發(fā)生的更改。
[Effect]Effect元數(shù)據(jù)標(biāo)簽用來定義一個(gè)自定義效果,當(dāng)某個(gè)事件發(fā)生的時(shí)候該效果會(huì)被分派。這個(gè)示例可以基于前面Event的例子來創(chuàng)建,通過簡(jiǎn)單地更改ButtonLabel類(
Listing 7)中的一行代碼,就定義了一個(gè)效果,該效果可以在MXML標(biāo)簽中直接使用(
Listing 8)。
[IconFile]IconFile是用來定義一個(gè)jpg,gif或者png文件的文件名的,它在你的自定義類中作為圖標(biāo)來使用。[Embed]元數(shù)據(jù)標(biāo)簽可以用來嵌入圖片、SWF文件、音樂文件以及視頻文件等,而IconFile則只是用來嵌入用來作為自定義類圖標(biāo)的文件。下面是一個(gè)IconFile的例子:
[IconFile("icon.png")]
public class CustomButton extends Button
{
}
[Inspectable]在使用Flex Builder 2的時(shí)候,你可能會(huì)希望某些自定義組件的屬性在代碼提示和屬性檢查器(property inspector)中顯示,Inspectable元數(shù)據(jù)標(biāo)簽就是用來定義那些屬性的。
Listing 9展示的例子定義了一個(gè)inspectable的ccType變量,它定義了Visa為默認(rèn)值、Credit Card為類別并將取值范圍定義為包含了Visa, Mastercard, Discover, 和 American Express的枚舉。
[InstanceType]當(dāng)在一個(gè)模板對(duì)象中聲明一個(gè)像IDeferredInstance這樣的變量時(shí),InstanceType元數(shù)據(jù)標(biāo)簽就用來聲明對(duì)象的類型。下面是InstanceType的用法:
[InstanceType("package.className")]
[NonCommittingChangeEvent]NonCommittingChangeEvent元數(shù)據(jù)標(biāo)簽在某個(gè)特定事件發(fā)生的時(shí)候可以防止變量在事件發(fā)生的過程中被更改。
Listing 10展示了它是如何工作的。一個(gè)名為s的字符串類型的私有變量被綁定到了名為ti2的TextInput組件上。另外一個(gè)id為ti1的TextInput組件在它的text發(fā)生更改的時(shí)候就會(huì)將s的值設(shè)置為它的text屬性的值。另外,當(dāng)triggerBinding 事件被分派的時(shí)候,附加在s變量上的Binding元數(shù)據(jù)標(biāo)簽就會(huì)進(jìn)行綁定。只有在Enter鍵在ti1 TextInput組件中被按下時(shí)才會(huì)分派triggerBinding事件。
[RemoteClass]RemoteClass可以用來將一個(gè)ActionScript類綁定到一個(gè)Java類或一個(gè)ColdFusion CFC。這樣做可以自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型。下面的例子將包c(diǎn)om.mydomain中的名為MyClass的ActionScript類綁定到了同一個(gè)包中名為MyClass的Java類:
package com.mydomain {
[Bindable]
[RemoteClass(alias="com.mydomain.MyClass")]
public class MyClass {
public var id:int;
public var myText:String;
}
}
[Style]Style元數(shù)據(jù)標(biāo)簽用來為組件定義自定義樣式屬性的。只需要簡(jiǎn)單地將Sytle元數(shù)據(jù)標(biāo)簽添加到類的定義當(dāng)然,然后就可以使用getSytle方法獲取它的值了。
Listing 11 和 12中的例子定義了兩個(gè)樣式,分別為borderColor 和fillColor,它們的數(shù)據(jù)類型都是uint。當(dāng)類初始化的時(shí)候這兩個(gè)樣式就會(huì)在標(biāo)簽中被設(shè)定。代碼中覆寫了updateDisplayList函數(shù),用自定義的樣式畫了一個(gè)圓形邊框并將其填充。
現(xiàn)在你應(yīng)該會(huì)有這樣的感覺了:“喔,現(xiàn)在我知道在哪里可以使用它們了”或者“嗯,我想我會(huì)在新的項(xiàng)目中嘗試使用這些元數(shù)據(jù)標(biāo)簽”。如果你沒有,那么你可能需要回過頭去再看一遍這篇文章。OK,我想說的是
Adobe Flex小組提供給我們的元數(shù)據(jù)標(biāo)簽不只是非常的強(qiáng)大,可以讓我們擴(kuò)展或自定義我們要做的東西,而且它還非常易于使用。通過使用它們,僅僅幾行代碼就可以完成一大堆事情。如果不使用這些標(biāo)簽,你會(huì)發(fā)現(xiàn)在Flex 2中實(shí)現(xiàn)一些東西是很辛苦的。