在Flex/Flash中自定义Metadata tag

  经常使用flex进行开发的朋友肯定对metadata tag不会陌生,比如大家常用的[Bindable],[Event]都是metadata,它的作用是为Flex编译器提供组件如何使用的信息。比如说你在组件中定义了一个事件,如果你想让flex编译器知道这个事件,从而在其他MXML中引用它,你就应该插入一个[Event]metadata tag,代码应该像下面这样。


[Event(name="myEvent", type="flash.events.Event")]

我们已经习惯了官方提供的metadata,那我们能否自定义metadata呢,答案是肯定的,现在我们就自定义一个metadata

用flex(我用的是flex4)新建一个AS项目,然后创建一个类TestClass,在类中编写如下代码。

  

 1 package
2 {
3 public class TestClass
4 {
5 [MyMetadata(param = "param value")]
6 public var name:String;
7 public function TestClass()
8 {
9 }
10 }
11 }

上面代码中我们自定义的一个metadata,叫MyMetadata,它还包含了一个param的变量,值是"param value".请注意name变量的修饰符是public。

然后我们打开flex的项目属性,在附加的编译器参数中增加

-keep-as3-metadata+=MyMetadata

这句的作用是告诉编译器,除了flex自带的metadata,我们自定义的MyMetadata也需要被使用。因此这里是+=,如果你写成了=,那flex自带的metadata将被忽略。

值得注意的是,当我使用flexSDK4.0以上版本时,即使不添加上面的编译器参数,仍然可以正常工作。

那到这里,我们如何使用自定义的Metadata呢。请看我们在TestClass构造函数中添加的的代码:

1 public function TestClass()
2 {
3 var xml:XML = flash.utils.describeType(this)
4 trace(xml.toXMLString())
5 }

describeType方法可以将一个类实例的所有公共非静态成员取出来(因此我们设name属性是public的), 存在一个XML中。如果你需要取出静态成员,可以传入类本身(比如本例中的TestClass)而非类的实例。在项目启动的类里new一个 TestClass,使其构造函数能执行(如果你是一个flash项目而非flex项目,请在发布设置中勾选导出swc,不然无法获得metadata信 息),运行时将打印如下信息到控制台:

 1 <type name="TestClass" base="Class" isDynamic="true" isFinal="true" isStatic="true">
2 <extendsClass type="Class"/>
3 <extendsClass type="Object"/>
4 <accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
5 <factory type="TestClass">
6 <extendsClass type="Object"/>
7 <variable name="name" type="String">
8 <metadata name="MyMetadata">
9 <arg key="param" value="param value"/>
10 </metadata>
11 <metadata name="__go_to_definition_help">
12 <arg key="file" value="E:\study\CustomizeMetatag\src\TestClass.as"/>
13 <arg key="pos" value="125"/>
14 </metadata>
15 </variable>
16 <metadata name="__go_to_ctor_definition_help">
17 <arg key="file" value="E:\study\CustomizeMetatag\src\TestClass.as"/>
18 <arg key="pos" value="157"/>
19 </metadata>
20 <metadata name="__go_to_definition_help">
21 <arg key="file" value="E:\study\CustomizeMetatag\src\TestClass.as"/>
22 <arg key="pos" value="50"/>
23 </metadata>
24 </factory>
25 </type>

大家可以看到,8-10行是我们自定义的metadata的完整描述,它处于name变量的子节点,表示它作用于name属 性。这意味着我们可以在运行时获得metadata的信息。在我们这个例子中metadata貌似没有任何实际的作用,但metadata的信息可以帮助 我们完成一些有趣的事情,比如看下面这个:

1 [ClickEvent(target="this.button",event="flash.events.MouseEvent.CLICK")]
2 public function clickEventHandler(event:MouseEvent):void
3 {
4 }

不在这个类中添加任何事件侦听,让clickEventHandler方法也能相应button的CLICK事件,大家想想怎么去实现吧。

posted on 2011-08-12 16:23  Dongxue.xie  阅读(1101)  评论(0编辑  收藏  举报

导航