Flex那些事儿--设置组件属性(二)
时间:2009-06-02 来源:bxl994
数组组成的对象
当组件属性的对象类型要将数组作为它的值,你可以在MXML中使用子标签来声明属性,就像下面的例子显示的一样:
<mynamespace:MyComponent>
<mynamespace:nameOfObjectProperty>
<mx:Array>
<mx:Number>94062</mx:Number>
<mx:Number>14850</mx:Number>
<mx:Number>53402</mx:Number>
</mx:Array>
</mynamespace:nameOfObjectProperty>
</mynamespace:MyComponent>
在这个例子中,用包含了三个number元素的数组初始化对象。
就像设置数组的标量值的一章描述的一样,包围着数组元素的<mx:Array>和</mx:Array>标签是可选择的和可以忽略的,如下例所示:
<mynamespace:MyComponent>
<mynamespace:nameOfObjectProperty>
<mx:Number>94062</mx:Number>
<mx:Number>14850</mx:Number>
<mx:Number>53402</mx:Number>
</mynamespace:nameOfObjectProperty>
</mynamespace:MyComponent>
仅有的例外是当你声明一个单个元素数组作为对象属性的时候。在这种情况下,Flex不会创建一个包含单个元素的数组的对象,取而代之的是Flex会创建一个对象并且声明该对象的值等于数组中单个元素。下面的例子中显示了两种的不同之处:
object=[element] // 包含了单个元素数组的对象
object=element // 与单个元素值相等的对象
如果你想创建一个单个元素的数组,需要用<mx:Array>和</mx:Array>标签将数组元素包起来,如下例所示:
<mynamespace:MyComponent>
<mynamespace:nameOfObjectProperty>
<mx:Array>
<mx:Number>94062</mx:Number>
</mx:Array>
</mynamespace:nameOfObjectProperty>
</mynamespace:MyComponent>
对象组成的数组
当组件的属性要将对象数组作为它的值的时候,你可以在MXML中使用子标签来声明该属性,如下例所示:
<mynamespace:MyComponent>
<mynamespace:nameOfProperty>
<mx:Array>
<mynamespace:objectType prop1="val1" prop2="val2"/>
<mynamespace:objectType prop1="val1" prop2="val2"/>
<mynamespace:objectType prop1="val1" prop2="val2"/>
</mx:Array>
</mynamespace:nameOfProperty>
</mynamespace:MyComponent>
在下例中,是一个包含了由ListItem对象组成的数组的组件。每个ListItem对象都由一个label和data属性。
<mynamespace:MyComponent>
<mynamespace:dataProvider>
<mx:Array>
<mynamespace:ListItem label="One" data="1"/>
<mynamespace:ListItem label="Two" data="2"/>
</mx:Array>
</mynamespace:dataProvider>
</mynamespace:MyComponent>
在下例中,你可以声明一个匿名类来作为dataProvider属性的值。
<mynamespace:MyComponent>
<mynamespace:dataProvider>
<mx:Array>
<mx:Object label="One" data="1"/>
<mx:Object label="Two" data="2"/>
</mx:Array>
</mynamespace:dataProvider>
</mynamespace:MyComponent>
就像设置数组的标量值的一章描述的一样,包围着数组元素的<mx:Array>和</mx:Array>标签是可选择的和可以忽略的,如下例所示:
<mynamespace:MyComponent>
<mynamespace:dataProvider>
<mx:Object label="One" data="1"/>
<mx:Object label="Two" data="2"/>
</mynamespace:dataProvider>
</mynamespace:MyComponent>
设置包含了XML数据的属性
如果组件的属性为XML数据,属性的值是用命名空间定义的XML片段。在下面的例子中,MyComponent对象的属性值就是XML数据:
<mynamespace:MyComponent>
<mynamespace:value xmlns:a="http://www.example.com/myschema">
<mx:XML>
<a:purchaseorder>
<a:billingaddress>
...
</a:billingaddress>
...
</a:purchaseorder>
</mx:XML>
</mynamespace:value>
</mynamespace:MyComponent>
在MXMl中设置样式和效果属性
MXML标签的样式或效果属性与其他属性不同,是因为这两个属性等同与ActionScript中的style和effect类,而并非是ActionScript类的属性。在ActionScript中设置这些属性要用setStyle(stylename, value)方法而不是用object.property = value 这样的标记法。
在ActionScript类中使用 [Style]或[Effect]元数据标签来定义样式或效果属性,而并不是用ActionScript变量或setter/getter方法来定义。
如下例所示,你可以在MXML中设置fontFamily样式属性:
<mx:TextArea id="myText" text="hello world" fontFamily="Tahoma"/>
刚才的MXML代码就等同与下面的ActionScript代码:
myText.setStyle("fontFamily", "Tahoma");
在MXML中设置事件属性
MXML标签的事件属性可以声明一个事件的事件监听器方法。这个事件属性就等同与在ActionScript中使用addEventListener方法来定义事件监听器一样。
在ActionScript类中使用[Event]元数据标签来定义事件属性,而并不是使用ActionScript变量或者setter/getter方法来定义。
如下例所示,你可以像这样在MXML中设置creationComplete事件属性。
<mx:TextArea id="myText" creationComplete="creationCompleteHandler()"/>
上面的MXML代码就等同与下面的ActionScript代码:
myText.addEventListener("creationComplete", creationCompleteHandler);
指定URL(统一资源定位符)值
一些MXML标签,比如<mx:Script>标签,有一种属性,该属性可以指定外部的文件作为它的URL值。例如,你可以在<mx:Script>标签中使用source属性来引用外部的ActionScript文件来代替直接在<mx:Script>标签体内直接使用ActionScript代码。
注意:你可以在<mx:Script>标签的source属性中指定一个代码文件。你不能在source属性指定一个ActionScript类。
MXML支持的几种URL定义类型:
§ 绝对定位,如下例所示:
§ <mx:Style source="http://www.somesite.com/mystyles.css">
§
§ 在运行时相对于Flex应用程序所在的Java web应用程序的网站根目录的路径,如下例所示:
§ <mx:HTTPService url="@ContextRoot()/directory/myfile.xml"/>
§
§ 在编译时相对于Flex应用程序所在的Java web应用程序的网站根目录的路径,如下例所示:
§ <mx:Script source="/myscript.as"/>
§
§ 相对于当前文件位置的路径,如下例所示:
§ <mx:Script source="../myscript.as"/>
定义正则表达式的值
你可以像下面的格式一样在MXML中定义正则表达式的值:
"/pattern/flags"
pattern 在两个斜线之间定义正则表达式。两个斜线都是缺一不可的。
flags (可选择的)可以给这个正则表达式定义任何的值。
例如,MXML组件的regExpression属性是正则表达式类型。因此,你可以像下面的例子一样来设置它的值:
<mynamespace:MyComponent regExpression="/\Wcat/gi"/>
或者使用子标签来设置,如下例所示:
<mynamespace:MyComponent>
<mynamespace:regExpression>/\Wcat/gi </mynamespace:regExpression>
</mynamespace:MyComponent>
正则表达式的flags部分是可选择的,所以你也可以像下面的例子一样来定义:
<mynamespace:MyComponent regExpression="/\Wcat/"/>
使用编译器标签
编译器标签是那些不直接等同与ActionScript对象或属性的标签。下面的这些编译器标签的命名必须第一个字母大写:
§ <mx:Binding>
§ <mx:Component>
§ <mx:Metadata>
§ <mx:Model>
§ <mx:Script>
§ <mx:Style>
§ <mx:XML>
§ <mx:XMLList>
下面的编译器标签所有的字母都是小写的:
§ <mx:operation>
§ <mx:request>
§ <mx:method>
§ <mx:arguments>
MXML标签的规则
MXML必须遵循一些语法规则:
§ 任何的标签的id属性都不是必须的。
§ 根标签不允许有id属性。
§ 布尔属性只有true和false两种属性。
§ <mx:Binding>标签需要源属性和目的属性。
§ <mx:Binding>标签不能有id属性。
§ <mx:WebService>标签需要wsdl值或目的值,但不需要同时存在。
§ <mx:RemoteObject>标签需要源值或者命名值,但不需要同时存在。
§ <mx:HTTPService>标签需要url值或者目的值,但不需要同时存在。
§ <mx:operation>标签需要name值,但不允许多个name存在。
§ <mx:operation>标签不允许有id属性。
§ <mx:method>标签需要name值,但不允许多个name存在。
§ <mx:method>标签不允许有id属性。