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