本章介绍 了MXML 2009新增的标签,包括:
Declarations标签是Flex 4中最常用的新增标签。
在Flex 3中,对于一个MXML组件的直接子元素,可以有以下几种情况:
1. 属性标签,例如:
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:text>
<mx:String>test</mx:String>
</mx:text>
</mx:Label>
2. 作为默认属性的值,例如:
List的默认属性为DataProvider
<mx:List xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:ArrayCollection>
....
</mx:ArrayCollection>
</mx:List>
3. 作为容器的Children:
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Button />
<mx:Label />
</mx:Canvas>
4. 声明并创建非可视化对象:
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:HTTPService id="sevice" />
</mx:Canvas>
在Flex 4中,对于MXML组件的直接子元素有着更加规范的定义,即:所有直接子元素或者是组件的属性标签,或者是作为组件默认属性的值而存在。而 容器的默认属性即为其Children的集合(例如Group的默认属性为mxmlContent,DataGroup的默认属性为 dataProvider)。
而对于最后一种情况,在Flex 4中,在MXML中创建非可视化对象,如HTTPService, Effect, 基本数据类型等等,必需通过<Declarations/>标签来完成。例如声明一个HTTPService对象:
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library:ns.adobe.com/flex/spark" >
<fx:Declarations>
<s:HTTPService id="service" />
</fx:Declarations>
</s:Group>
上面的代码等价于ActionScript:
public MyGroup extends Group {
private var service:HTTPService = new HTTPService();
}
值得注意的是,Declarations标签也可以用来声明、创建任何可视化组件,但是使用该标签创建的组件不 会被加入到DisplayList中,也不会被初始化。你可以在需要的时候再使用它。
Vector是Flash Player 10中新增加的数据类型(结构),大多数情况下,使用Vector比使用Array更加高效。在Flex 4中,你可以通过MXML来创建一个Vector对象,例如:
<fx:Declarations>
<fx:Vector id="myVector" type="String" fixed="false" />
</fx:Declarations>
上述代码相当于ActionScript:
public var myVector:Vector.<String> = new Vector.<String>(0,false);
Library标签允许你为当前的MXML组件声明一个”类库“。相应地,Definition标签可以定义该类库中的一个”类”。基本的语法规则 如下:
下面的代码中,使用Library和Definition标签创建了MyClass类及其子类MySubClass:
<!-- MyApp.mxml -->
<s:Applicaiton xmlns:fx=... >
<fx:Library>
<!-- 此处定义了一个名为MyClass的类,继承自Group类 -->
<fx:Definition name="MyClass">
<s:Group>
<s:Rect width="200" height="200">
<s:fill .../>
</s:Rect>
</s:Group>
</fx:Definition>
<!-- 此处定义了一个名为MySubClass的类,继承自MyClass类>
<fx:Definiton name="MySubClass">
<fx:MyClass />
</fx:Definition>
</fx:Library>
<!-- 使用MyClass和MySubClass类 -->
<fx:MyClass />
<fx:MySubClass />
</s:Application>
此外,由Definition定义的类实例,不能赋予id属性(例如,在上面代码中,如果为MyClass实例声明id属性会造成编译错误)。这 本质上是由Library的“私有性”决定的。在大多数情况下,该标签会在FXG中使用,用于定义可重用的图形元素。
小技巧
事实上,尽管不能为Definition定义的类的实例赋予id属性,我们仍然可以获取这些类的 实例的引用,通过查看Flex编译后的AS代码(使用-keep参数)可以发现:所有由Definition定义的类最终会被转化为类名 为”MXML类名_definitionN.as”这样的独立ActionScript类。
例如,上面例子(MXML类名为 MyApp)中的MyClass和MySubClass最终会被转化为MyApp_definition1和MyApp_definition2。在确定 这些类的实际类名后,我们可以通过一些系统事件来获取这些类的引用并对其进行操作,例如:
<!-- Test.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="..." xmlns:s="..." >
<fx:Library>
<fx:Definition name="MyRect" >
<s:Group width="100" height="100">
....
</s:Group>
</fx:Definition>
</fx:Library>
<fx:MyRect creationComplete="myrect1_creationComplete(event)"/>
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
private var myRect:Test_definition1 ;
<!-- 通过事件获取实例的引用 -->
protected function myrect1_creationComplete(event:FlexEvent):void
{
myRect = event.target as Test_definition1;
myRect.x = 200;
}
]]>
</fx:Script>
</s:Application>
Private标签用于提供MXML和FXG文档的元信息,标签内的内容会被编译器忽略。尽管如此,你必须保证其内容是有效的XML格式。例如:
<fx:Private>
<Author>Jinni Cao</Author>
<Version>1.0</Version>
<Site>http://www.SWFever.com</Site>
</fx:Private>
我们将在下一章“改进的视图状态语法”中详细介绍Reparent标签的使用方法。
本章着重介绍了几个MXML 2009新增加的语言级标签。在下一章中,我们将介绍在Flex 4中被大幅改进的一个特性:视图状态(View State)。