21.10.在组件中创建元数据

21.10.1.问题
我希望为组件创建元数据属性,这样就能用在为特定程序开发的组件上,或者保存类的外部属性。
21.10.2.解决方案
设置-keep-metadata项,这样编译器会保存Flash编译器生成的元数据,并在运行时查看那个数据。
21.10.3.讨论
运行期搜集元数据的功能使得你能够创建自己的标签,其他开发者可以使用这些标签标记类的特定属性,这很像Flex框架中的[Bindable]。它也能使你查看一个类中的任意元属性,比如,像下面这样声明一个元属性:
+展开
-ActionScript
[CustomMetaProp(metaPropOne="foo", metaPropTwo="bar")]

就可以在运行时查看它。首先在要跟那个属性一起编译的自定义类中声明一个自定义属性:
+展开
-ActionScript
package oreilly.cookbook {
import flash.utils.*;
public class CustomMetaData {
public function CustomMetaData() {}
public function getdescription():Object{return describeType(this);}
[CustomMetaProp(metaPropOne="foo", metaPropTwo="bar")]
public function get propertyThatContainsMetaData():Object{return null ;}
public function set propertyThatContainsMetaData(value:Object):void{}
}
}

真正的逻辑发生在describeType方法中,该方法会把存储在播放器字节码中一个类的所有信息以XML的格式输出。如果元数据和元数据的信息都设置正确了,那么不仅会返回类信息,对象的所有元数据信息也会返回。要确保元数据保存在SWF中,创建一个包含如下内容的metaconf.xml文件:
+展开
-XML
<?xml version="1.0"?>
<flex-config xmlns="http://www.adobe.com/2006/flex-config">
<compiler>
<keep-as3-metadata>
<name>CustomMetaProp</name>
</keep-as3-metadata>
<keep-generated-actionscript>true</keep-generated-actionscript>
<source-path><path-element>.</path-element></source-path>
</compiler>
</flex-config>

这个XML文件描述了应该保存在字节码中的元数据属性;在本例中,所有的CustomMetaProp元数据都会被保存。在编译时,像下面这样把metaconf.xml传递给编译器:
-load-config+="meta-config.xml"
编译完成后,就可以像下面这样访问CustomMetaData类的元数据了:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxmllayout="vertical">
<mx:Script>
<![CDATA[
import oreilly.cookbook.CustomMetaData;
private var metaData:CustomMetaData = new CustomMetaData();
private function displayDescription():void {
var xmlData:XML= metaData.description;
trace(String(xmlData.accessor.(@name=="propertyThatContainsMetaData")));
}

]]>
</mx:Script>
<mx:Button label="Describe"click="displayDescription()"/>
</mx:Application>

因为describeType返回的X是ML,可以使用E4X的语法访问名为propertyThatConatinsMetaData的包含了元数据的属性,将会输出如下结果:
+展开
-XML
<accessor name="propertyThatContainsMetaDataaccess="readwritetype="ObjectdeclaredBy="oreilly.cookbook::CustomMetaData">
<metadata name="CustomMetaProp">
<arg key="metaPropOnevalue="foo"/>
<arg key="metaPropTwovalue="bar"/>
</metadata>
</accessor>

加支付宝好友偷能量挖...


评论(0)网络
阅读(122)喜欢(0)flash/flex/fcs/AIR