`
harry9888
  • 浏览: 67504 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

Flex 2 中的元数据标签

阅读更多
——告诉编译器如何编译

虽然多数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);

    }




[DefaultProperty]

DefaultProperty元数据标签用来将一个单一属性设定为某个类的默认属性。它允许在一个容器标签内设定属性,而不用定义属性的名字。一个简单的例子就是一个自定义Button类。Listing 3展示了一个简单的Button类,它将label属性设定为了DefaultProperty。
分享到:
评论
2 楼 ioryioryzhan 2008-07-08  
引用

Listing 1 A simple use of [Bindable]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
[Bindable]
private var me:String="Rich Tretola";
]]>
</mx:Script>
<mx:Panel title="Simple Binding" width="500" height="90"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<mx:Label text="{me}"/>
</mx:Panel>
</mx:Application>

Listing 2 Using [Bindable] with getters and setters

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
private var _phoneNumber:String = �";
// Bind getter function to phoneNumberChanged event
[Bindable(event="phoneNumberChanged")]
public function get phoneNumber():String {
return _phoneNumber;
}
// Setter method.
public function set phoneNumber(value:String):void {
if (value.length<10) {
_phoneNumber = value;
} else {
_phoneNumber = phoneFormatter.format(value);
}
// Create and dispatch event
var eventObj:Event = new Event(損honeNumberChanged");
dispatchEvent(eventObj);
}
]]>
</mx:Script>
<mx:PhoneFormatter id="phoneFormatter"
formatString="(###) ###-####" validPatternChars="#-()
�/>
<mx:Panel title="Bind with Getters and Setters"
width="500" height="90"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<mx:TextInput id="ti1" change="phoneNumber=ti1.text"
maxChars="10" restrict="0-9"/>
<mx:TextInput id="ti2" text="{phoneNumber}"/>
</mx:Panel>
</mx:Application>

Listing 3 Custom Button class named MyButton

package
{
import mx.controls.Button;
[DefaultProperty(搇abel")]
public class MyButton extends Button
{
}
}

Listing 4 Using the MyButton class wih [DefaultProperty]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comps="*">
<comps:MyButton>
<mx:String>Test</mx:String>
</comps:MyButton>
</mx:Application>

Listing 5 Custom ButtonLabel class using [Event]

package
{
import mx.controls.Button;
import flash.events.Event;
// Define the custom event
[Event(name="labelChanged", type="flash.events.Event")]
public class ButtonLabel extends Button {
// property to hold label value
private var _myLabel:String;
// public setter method
public function set myLabel(s:String):void {
_myLabel = s;
this.label = s;
// Create and dispatch custom event
var eventObj:Event = new Event(搇abelChanged");
dispatchEvent(eventObj);
}
}
}

Listing 6 Using the ButtonLabel class with the labelChanged [Event]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comps="*"
backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.events.Event;
// method to handle custom event
public function labelChanged(eventObj:Event):void {
myTA.text= myTA.text + 揬n"+ eventObj.target.label;
myTA.verticalScrollPosition = myTA.verticalScrollPosition +
20;
}
]]>
</mx:Script>
<mx:Panel title="Event Sample" width="500" height="275"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="absolute">
<mx:TextInput id="buttonLabelTI"
change="myButton.myLabel=buttonLabelTI.text" x="10" y="9"/>
<!--Instantiate custom class and define method to handle label-
Changed event-->
<comps:ButtonLabel id="myButton" labelChanged="labelChanged(event)
;"
x="10" y="39"/>
<mx:TextArea id="myTA" width="200" height="200" x="249" y="10"/>
</mx:Panel>
</mx:Application>

Listing 7 Add the Effect metadata tag

...
// Define the custom event
[Event(name="labelChanged", type="flash.events.Event")]
[Effect(name="labelChangedEffect", event="labelChanged")]
public class ButtonLabel extends Button {
...

Listing 8 Add labelChangedEffect to the Component

Instantiation MXML Tag
<comps:ButtonLabel id="myButton" labelChanged="labelChanged(event);"
labelChangedEffect="myEffect" x="10" y="39"/>

Listing 9 Custom component with [Inspectable] defined

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Inspectable(defaultValue="Visa",
enumeration="Visa,Mastercard,Discover,American Express"
category="Credit Card" type="String")]
public var ccType:String;
]]>
</mx:Script>
</mx:HBox>

Listing 10 Using [NonCommittingChangeEvent]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
import flash.events.Event;
private var eventObj:Event;
[Bindable(event="triggerBinding")]
[NonCommittingChangeEvent(揷hange")]
private var s:String;
private function triggerBinding():void{
eventObj = new Event(搕riggerBinding");
dispatchEvent(eventObj);
}
]]>
</mx:Script>
<mx:Panel title="NonCommittingChangeEvent Sample" width="500"
height="90"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<mx:TextInput id="ti1" change="s=ti1.text" enter="triggerBinding()"
/>
<mx:TextInput id="ti2" text="{s}" />
</mx:Panel>
</mx:Application>

Listing 11 Custom Class CustomCircle using [Style] tags

package
{
import mx.core.UIComponent;
[Style(name="borderColor",type="uint",format="Color",inherit="no")]
[Style(name="fillColor",type="uint",format="Color",inherit="no")]
public class CustomCircle extends UIComponent {
public function CustomCircle(){
super();
}
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
graphics.lineStyle(1, getStyle(揵orderColor"), 1.0);
graphics.beginFill(getStyle(揻illColor"),1.0);
graphics.drawEllipse(0,0,100,100);
}
}
}

Listing 12 Using CustomCircle and assigning custom style properties

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comps="*"
backgroundColor="#FFFFFF">
<mx:Panel title="Style Sample" width="200" height="200"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<comps:CustomCircle borderColor="#000000" fillColor="#FF0000" />
</mx:Panel>
</mx:Application>
1 楼 bufanliu 2008-04-20  
harry9888 写道
——告诉编译器如何编译

虽然多数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);

    }




[DefaultProperty]

DefaultProperty元数据标签用来将一个单一属性设定为某个类的默认属性。它允许在一个容器标签内设定属性,而不用定义属性的名字。一个简单的例子就是一个自定义Button类。Listing 3展示了一个简单的Button类,它将label属性设定为了DefaultProperty。

相关推荐

    Flex 中的元数据标签

    Flex 中的元数据标签的用法和详细介绍

    flex as3 元数据标签综合

    在Flex与AS3(ActionScript 3)开发中,元数据标签(Metadata Tags)是一种重要的语法结构,用于向编译器提供有关类或成员的额外信息。这些标签能够帮助编译器优化代码、提供更强大的功能,并允许开发者实现自定义...

    Flex_2_中的元数据标签

    ### Flex 2 中的元数据标签 元数据标签在 Flex 2 开发中扮演着重要的角色,它们为编译器提供了必要的信息以更好地理解和编译应用程序。这些标签并不直接参与 SWF 文件的生成,而是作为指导编译过程的重要工具。 ##...

    flex数据绑定的原理

    当我们使用`[Bindable]`元数据标签标记一个类的成员变量时,Flex编译器会自动为这个变量生成相关的访问器(getter和setter)。例如,在提供的代码段中,`list`变量被标记为`[Bindable]`: ```actionscript public ...

    Flex DataGrid从XML文件中加载数据

    7. **数据绑定**:`[Bindable]`元标签用于声明变量`users`是可绑定的,意味着当`users`的值改变时,任何绑定到`users`的UI组件都会自动更新。 ```actionscript [Bindable] private var users:XML; ``` 总结来说,...

    FLEX数据绑定专题

    例如,通过使用Bindable元标签或Bindable类修饰符,可以实现输入控件(如TextInput)与数据模型间的双向绑定: ```mxml ``` 在Flex中,数据绑定是提高开发效率、简化代码的关键特性。结合Java后端,开发者可以...

    Flex中采用Flex-config.xml进行命令行的编译

    这个文件通常位于项目的根目录下,用于控制编译过程中的各种选项,包括SWF版本、优化设置、元数据、库路径等。通过修改`flex-config.xml`,开发者可以实现更高效、更个性化的编译流程,尤其在命令行编译时,其作用...

    flex 绑定元数据

    在Flex编程中,[Embed]标签属于元数据标记之一,它的作用是将外部的资源(如图片、声音、视频等)嵌入到应用程序中。嵌入后,这些资源可以通过类的形式在应用程序中被引用。具体来说,[Embed]标签通过指定资源的路径...

    Flex中文本高亮显示

    - `.project`:Eclipse项目配置文件,定义了项目的类型和其他元数据。 - `html-template`:可能是Flex应用程序的HTML包装器模板,用于在浏览器中运行SWF文件。 - `.settings`:Eclipse项目的首选项存储目录,包含了...

    flex 使用swc 包

    4. **元数据**:关于组件或类的元信息,例如元数据可以指定组件的外观和行为。 描述中提到的“flex3引用的swc包”,表明这是一个适用于Flex 3版本的SWC库。Flex 3是Flex框架的一个早期版本,它引入了许多特性,比如...

    flex map

    "Flex Map"是一个在IT行业中涉及的...通过阅读提供的博客文章和研究压缩包内的`library.swf`和`catalog.xml`文件,开发者可以学习如何在Flex项目中创建和自定义地图功能,以及如何利用资源库和元数据进行更有效的开发。

    Flex分页技术

    在Flex开发中,数据展示通常会涉及到大量的数据处理,如分页、排序、过滤和关键字搜索等。在Flex中,我们可以使用DataGrid组件来实现这些功能,提高用户体验并优化性能。 1. **Flex DataGrid 分页技术**: Flex ...

    flex2_createextendcomponents.zip

    "flex2_createextendcomponents.zip"中的资源很可能是关于如何在Flex 2中创建和扩展自定义组件的教程或指南。 在Flex 2中,创建自定义组件主要涉及以下几个步骤: 1. **定义组件类**:首先,你需要创建一个继承自...

    flex笔记 flex笔记 flex笔记

    - 元数据(`&lt;mx:metadata&gt;`)用于为组件提供额外的信息或配置选项。 #### ActionScript 1. **网络通信**: - Flex使用ActionScript来处理网络通信。例如,`&lt;mx:HTTPService&gt;` 标签可以用于发起HTTP请求。 - 在...

    Flex 项目安装备份文件

    项目文件包括源代码、资源配置、元数据以及库引用等。 在“Flex项目安装备份文件”中,备份至关重要,因为源代码是任何项目的核心。源码备份能防止意外的数据丢失,例如计算机故障、病毒攻击或代码误删。定期备份...

    FLEX数据绑定四种方式

    [Bindable]是一个元数据标签,用于标记那些可以进行数据绑定的变量或方法。当数据源发生变化时,Flex会自动触发相应的事件,使得UI能够实时更新。 **使用方法** 例如,标记一个变量为可绑定: ```xml &lt;![CDATA[ ...

    flex3去水印简单实用的方法

    总的来说,Flex 3的水印去除是一个相对简单的过程,主要通过创建一个特定的类并将其添加到MXML文件的元数据中。然而,这种方法应该谨慎使用,因为可能涉及到版权和许可问题。如果需要完全自定义界面,考虑购买无水印...

    FLEX 数据绑定专题一(转)

    2. ActionScript数据绑定:在ActionScript代码中,可以使用Bindable元标签声明类的属性为可绑定的,然后使用`bindable`关键字定义绑定表达式。 数据绑定的应用场景: 数据绑定在FLEX中广泛应用于各种场景,包括但不...

    flex中paner的特效

    我们可以使用`[Embed]`元数据标签将SWF文件嵌入到项目中,并在`skinClass`属性中引用它。 至于`empty.swf` 文件,它可能是另一个预编译的皮肤或者是未使用的资源。在Flex中,SWF皮肤不仅可以包含静态图像,还可以...

Global site tag (gtag.js) - Google Analytics