最近因为工作上的需要,在学习flex.看了creating and extending flex2 components文档,网页链接如下:http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=metadata_141_01.html#161936
有兴趣的可以一起研究下哈。
在学习到MetaData的时候,对其中的[InstanceType]这个不是很理解。按照文档中的解释,它是用来限定组建类型的。应用于创建模板的场景。请看如下代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" initialize="init();">
<mx:Script>
<![CDATA[
import mx.validators.ValidationResult;
import mx.core.UIComponent;
import mx.containers.HBox;
import mx.controls.CheckBox;
[InstanceType("mx.controls.Button")]
public var topRow:IDeferredInstance;
[InstanceType("mx.controls.Button")]
[ArrayElementType("mx.core.IDeferredInstance")]
public var bottomRow:Array;
private function init():void{
addChild(UIComponent(topRow.getInstance()));
var controlbox:HBox = new HBox();
for(var i:int = 0;i<bottomRow.length;i++){
controlbox.addChild(UIComponent(bottomRow[i].getInstance()));
}
addChild(controlbox);
}
]]>
</mx:Script>
</mx:VBox>
在上面的代码中,使用了:(1)[InstanceType("mx.controls.Button")]
public var topRow:IDeferredInstance;
我们写了一个TemplateTest.mxml
对这个MyTemplateComponentDeferredSpecific.mxml进行使用的时候:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:MM = "components.*">
<mx:Panel paddingTop="10" paddingBottom="10"
paddingRight="10" paddingLeft="10">
<MM:MyTemplateComponentDeferred >
<MM:topRow>
<mx:Label text="button" />
</MM:topRow>
<MM:bottomRow>
<mx:Button id="save" label="save1"/>
<mx:Button id="btn2" label="cancel"/>
<mx:Button id="btn3" label="back"/>
</MM:bottomRow>
</MM:MyTemplateComponentDeferred>
</mx:Panel>
</mx:Application>
与以上(1)处代码对应的是<MM:topRow>
<mx:Label text="button" />
</MM:topRow>
MetaData的作用就是告诉编译器如何去解析识别代码,所以在编译的时候,就对topRow里面的组建类型进行检验,由于这里是Label类型,而如(1)处代码所示,模板中限定了只能为Button类型,不匹配,便出现了error提示:In initializer for 'topRow': type mx.controls.Label is not assignable to target type mx.controls.Button
然后将它改称<mx:Button label="button">编译通用,没问题了。
但是,怀着好奇心,又试了一下,将它改成了<mx:CheckBox label="box">,问题出现了,居然没有报错。
遂又试了几个,将[InstanceType("mx.controls.Button")]改称[InstanceType("mx.controls.CheckBox")],也没问题。然后将<MM:topRow>
<mx:Label text="button" /> </MM:topRow>
改成<MM:topRow>
<mx:Button label="button" />
</MM:topRow>
出现warning:[InstanceType](mx.controls:CheckBox): type mx.controls:CheckBox is unavailable.
但是运行还是可以的,生成Button组建。
难道是组建之间存在什么兼容性?望高人指点。