对flex中的[InstanceType]的困惑

最近因为工作上的需要,在学习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组建。
难道是组建之间存在什么兼容性?望高人指点。



你可能感兴趣的:(html,工作,xml,Flex,Adobe)