flex的[Bindable]標籤

雖然多數Flex 開發者都使用過[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可以用來綁定簡單數據類型、類、複雜數據類型以及函數。綁定數據的時候,你必須先使用元數據標籤定義一下數據

Bindable也可以用來綁定到事件。Listing 2展示瞭如何使用getter和setter函數將一個屬性綁定到一個事件上。這個例子中有一個叫做phoneNumber的私有變量,還有一個公有的 setter和getter函數。使用Bindable標籤將這個getter方法綁定到了一個叫做phoneNumberChanged的事件上,只要 數據發生改變setter方法就會分派phoneNumberChanged事件。通過使用setter方法,可以在數據賦予私有變量之前對其進行操作。 在這個例子中,數據只有在長度大於等於10的時候纔會被格式化。當phoneNumberChanged事件被分派的時候,第二個TextInput組件 會被更新,因爲他的text屬性綁定到了phoneNumber變量上。

當一個屬性來自一個數據表達式,當源屬性改變時,Flex 自動複製源屬性的值到任何目標屬性。爲了標示着一複製,你必須使用[Bindable]元數據標籤在flex 中註冊這一屬性,並且源屬性必鬚髮送一個事件。

[Bindable]元數據標籤採用以下格式

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

如果你省略了事件名,flex 自動創建一個事件名propertyChange

你可以在三個地方使用[Bindable]元數據標籤
1、在public class定義前
[Bindable]元數據標籤綁定所有的作爲變量定義的public屬性,並且所有的public屬性都定義有getter和setter方法。在這種情況下,[Bindable]沒有參數,例如:
[Bindable]
public class TextAreaFontControl extends TextArea {}
flex 編譯器自動創建一個事件名叫propertyChange用於所有的公有屬性,這些屬性可以作爲綁定表達式的源。這種定義等同於
[Bindable(event="propertyChange")]

如果屬性值的改變與原來相同,flex 並不傳遞這個事件或更新屬性。

2、在public, protected 或 private 屬性前,格式爲:
[Bindable]
public var foo;


3、Before a public, protected, or private property defined by a getter or setter method.
你必須同時定義getter和setter方法,以便於使用[Bindable]元數據標籤。
[Bindable]
public function set shortNames(val:Boolean):void {
...
}

public function get shortNames():Boolean {
...
}


你可以使用自定義的事件名,如:
[Bindable(event="changeShortNames")]
public function set shortNames(val:Boolean):void {
...
// Create and dispatch event.
dispatchEvent(new Event("changeShortNames"));
}

// Get method.
public function get shortNames():Boolean {
...
}

// Define public vars for tracking font size.
[Bindable]
public var maxFontSize:Number = 15;
[Bindable]
public var minFontSize:Number = 5;

// Define private variable.
private var _maxFontSize:Number = 15;

[Bindable(event="maxFontSizeChanged")]
// Define public getter method.
public function get maxFontSize():Number {
return _maxFontSize;
}

// Define public setter method.
public function set maxFontSize(value:Number):void {
if (value <= 30) {
_maxFontSize = value;
} else _maxFontSize = 30;

// Create event object.
var eventObj:Event = new Event("maxFontSizeChanged");
dispatchEvent(eventObj);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章