螢幕上的程式碼特寫,象徵編譯器讀取原始碼進行編譯

← INSIGHTS & PERSPECTIVES | 前端開發

Flex 元數據標籤——告訴編譯器如何編譯

Flex 元數據標籤(如 Bindable、Embed、Event、RemoteClass)不會被編譯進 SWF,而是告訴編譯器如何編譯。本文整理 12 個 Flex 元數據標籤的定義與使用範例,幫你搞懂何時該用哪個標籤。

雖然多數 Flex 開發者都用過 [Bindable] 標籤,但很多人其實不知道這個標籤的作用,甚至不知道該標籤為何物。[Bindable] 就是所謂的元數據標籤(metadata tag)。元數據標籤是一種特殊的標籤,它在程式碼中的作用就是向編譯器提供「如何編譯程式」的資訊。實際上,這些標籤並沒有被編譯到生成的 SWF 檔案中,而只是告訴編譯器如何生成 SWF 檔案。文件中列出的元數據標籤共有 12 個,本文將講解這些元數據標籤的定義並給出使用它們的範例,看完這篇文章之後,你就會明白應該在何時、何處在你的 Flex 應用程式中使用元數據標籤了。

[ArrayElementType] 怎麼限制陣列元素的型別?

實際上,定義一個陣列通常來說是一件很平常的事情,因為陣列中的元素可以是任何型別的。不過,使用 ArrayElementType 元數據標籤可以讓你定義陣列元素的資料型別。下面的例子展示了如何使用 [ArrayElementType]:

```actionscript

[ArrayElementType("String")]

public var arrayOfStrings:Array;

[ArrayElementType("Number")]

public var arrayOfNumbers:Array;

[ArrayElementType("mx.core.UIComponent")]

public var arrayOfUIComponents:Array;

```

[Bindable] 為什麼是最常用的元數據標籤?

Bindable 元數據標籤是最經常用到的一個元數據標籤,因為它使程式組件之間的資料同步變得很容易。Bindable 可以用來綁定簡單資料型別、類別、複雜資料型別以及函式。綁定資料的時候,你必須先使用元數據標籤定義一下資料。

Bindable 也可以用來綁定到事件。可以使用 getter 和 setter 函式將一個屬性綁定到一個事件上:範例中有一個叫做 phoneNumber 的私有變數,還有一個公有的 setter 和 getter 函式。使用 Bindable 標籤將這個 getter 方法綁定到一個叫做 phoneNumberChanged 的事件上,只要資料發生改變,setter 方法就會分派 phoneNumberChanged 事件。透過使用 setter 方法,可以在資料賦予私有變數之前對其進行操作——例如資料只有在長度大於等於 10 的時候才會被格式化。當 phoneNumberChanged 事件被分派的時候,第二個 TextInput 組件會被更新,因為它的 text 屬性綁定到了 phoneNumber 變數上。

[DefaultProperty] 有什麼用途?

DefaultProperty 元數據標籤用來將一個單一屬性設定為某個類別的預設屬性。它允許在一個容器標籤內設定屬性,而不用定義屬性的名字。一個簡單的例子就是一個自訂 Button 類別:將 label 屬性設定為 DefaultProperty 之後,label 屬性就可以在自訂 Button 標籤中直接以字串定義,不用再寫出屬性名稱。

[Embed] 怎麼把圖片嵌入程式?

Embed 元數據標籤用來匯入圖片到程式。可以透過兩種方式使用 Embed:你可以將圖片嵌入到 ActionScript 中並將其指派給一個變數,或者你也可以將圖片直接指派給組件的屬性。

例 1——嵌入到變數再綁定到多個組件:

```actionscript

[Embed(source="myIcon.gif")]

[Bindable]

public var myIcon:Class;

```

```mxml

```

例 2——直接在組件屬性中嵌入:

```mxml

```

上面這兩個例子產生的結果是一樣的。建立 myIcon 類別的好處是,它在一個類別中只定義一次,並可以綁定到程式中的多個組件。

[Event] 與 [Effect] 怎麼宣告自訂事件與效果?

Event 元數據標籤用來宣告那些被自訂類別分派的事件。將這個元數據標籤加入到類別定義中之後,你就可以在 MXML 標籤中加入事件處理函式來初始化該自訂類別。做法是建立一個自訂 Button 類別,每當它的 label 屬性改變的時候就分派一個事件;主程式檔案初始化這個自訂 Button 並建立事件處理函式,該函式將新的 label 屬性值賦給一個 TextArea 組件,以顯示當前發生的更改。

Effect 元數據標籤則用來定義一個自訂效果,當某個事件發生的時候該效果會被分派。這個範例可以基於前面 Event 的例子來建立,透過簡單地更改 ButtonLabel 類別中的一行程式碼,就定義了一個效果,該效果可以在 MXML 標籤中直接使用。

[IconFile] 跟 [Embed] 有什麼不同?

IconFile 是用來定義一個 jpg、gif 或者 png 檔案的檔名的,它在你的自訂類別中作為圖示來使用。[Embed] 元數據標籤可以用來嵌入圖片、SWF 檔案、音樂檔案以及視訊檔案等,而 IconFile 則只是用來嵌入用來作為自訂類別圖示的檔案。下面是一個 IconFile 的例子:

```actionscript

[IconFile("icon.png")]

public class CustomButton extends Button{}

```

[Inspectable] 怎麼讓屬性出現在程式碼提示與屬性檢查器?

在使用 Flex Builder 2 的時候,你可能會希望某些自訂組件的屬性在程式碼提示和屬性檢查器(property inspector)中顯示,Inspectable 元數據標籤就是用來定義那些屬性的。範例中定義了一個 inspectable 的 ccType 變數,它定義了 Visa 為預設值、Credit Card 為類別,並將取值範圍定義為包含了 Visa、Mastercard、Discover 和 American Express 的列舉。

同樣的程式碼切到設計視圖時,就能在屬性檢查器中看到屬性 ccType 的類別為 Credit Card,它的所有可選的值都在下拉選單中。

[InstanceType] 怎麼宣告模板物件的型別?

當在一個模板物件中宣告一個像 IDeferredInstance 這樣的變數時,InstanceType 元數據標籤就用來宣告物件的型別。下面是 InstanceType 的用法:

```actionscript

[InstanceType("package.className")]

```

[NonCommittingChangeEvent] 怎麼避免頻繁觸發綁定?

NonCommittingChangeEvent 元數據標籤在某個特定事件發生的時候,可以防止變數在事件發生的過程中被更改。它的工作方式是:一個名為 s 的字串型別私有變數被綁定到了名為 ti2 的 TextInput 組件上;另外一個 id 為 ti1 的 TextInput 組件在它的 text 發生更改的時候,就會將 s 的值設定為它的 text 屬性的值。另外,當 triggerBinding 事件被分派的時候,附加在 s 變數上的 Binding 元數據標籤就會進行綁定——只有在 Enter 鍵在 ti1 TextInput 組件中被按下時才會分派 triggerBinding 事件。

[RemoteClass] 怎麼把 ActionScript 類別對應到 Java 類別?

RemoteClass 可以用來將一個 ActionScript 類別綁定到一個 Java 類別或一個 ColdFusion CFC。這樣做可以自動轉換資料型別。下面的例子將套件 com.mydomain 中名為 MyClass 的 ActionScript 類別綁定到了同一個套件中名為 MyClass 的 Java 類別:

```actionscript

package com.mydomain {

[Bindable]

[RemoteClass(alias="com.mydomain.MyClass")]

public class MyClass {

public var id:int;

public var myText:String;

}

}

```

[Style] 怎麼為組件定義自訂樣式屬性?

Style 元數據標籤用來為組件定義自訂樣式屬性。只需要簡單地將 Style 元數據標籤加入到類別的定義,然後就可以使用 getStyle 方法取得它的值了。範例中定義了兩個樣式,分別為 borderColor 和 fillColor,它們的資料型別都是 uint。當類別初始化的時候這兩個樣式就會在標籤中被設定;程式碼中覆寫了 updateDisplayList 函式,用自訂的樣式畫了一個圓形邊框並將其填充。

現在應該會有這樣的感覺了:「喔,現在我知道在哪裡可以使用它們了」或者「嗯,我想我會在新的專案中嘗試使用這些元數據標籤」。如果沒有,那麼你可能需要回過頭去再看一遍這篇文章。我想說的是,Adobe Flex 小組提供給我們的元數據標籤不只是非常強大,可以讓我們擴展或自訂我們要做的東西,而且還非常易於使用。透過使用它們,僅僅幾行程式碼就可以完成一大堆事情。如果不使用這些標籤,你會發現在 Flex 2 中實現一些東西是很辛苦的。

延伸閱讀

常見問題

QFlex 元數據標籤會被編譯進 SWF 檔案嗎?

不會。元數據標籤只是告訴編譯器「如何」生成 SWF 的資訊,它們本身並沒有被編譯到最終生成的 SWF 檔案中,執行階段看不到這些標籤。

Q最常用的 Flex 元數據標籤是哪一個?

是 [Bindable]。它讓組件之間的資料同步變得很容易,可以用來綁定簡單資料型別、類別、複雜資料型別以及函式,也可以搭配 getter/setter 綁定到自訂事件。

Q[Embed] 和 [IconFile] 有什麼差別?

[Embed] 可以嵌入圖片、SWF、音樂與視訊等各種資源;[IconFile] 則只用來指定一個 jpg、gif 或 png 檔作為自訂類別的圖示,用途範圍窄得多。

Q[RemoteClass] 的作用是什麼?

[RemoteClass] 用來把 ActionScript 類別綁定到 Java 類別或 ColdFusion CFC,透過 alias 指定對應的類別名稱之後,資料型別會自動轉換。

Q[ArrayElementType] 能解決什麼問題?

ActionScript 的 Array 本身元素可以是任何型別,加上 [ArrayElementType] 之後可以限定陣列元素的資料型別,讓編譯器與工具幫你檢查型別正確性。

參考資料

  • Adobe Flex 官方文件中的元數據標籤(metadata tag)列表

最後更新

2026-08-28(原文發布於 2009-11-13,本文保留原始筆記內容並補上 GEO 結構。)

關於作者 {#author}

Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。

首次發布:2009-11-13