编译mxml详解及代码详解


编译 MXML 为 SWF 文件 你将你的应用作为 SWF 文件部署,或者你如果有 Adobe LiveCycle Data Services ES 你可以将你的应用 作为一组 MXML,as 文件来部署。 如果你使用 flex builder,你可以在 flex builder 中编译,运行 swf 文件,如果你的程序执行正确,你 可以用 copy 这些文件到一个 web 容器中的方法,来部署这个应用。用户可以通过 http://hostname/path/filename.html 访问这个已经部署的 swf 文件。 flex 还有一个基于命令行的编译器,mxmlc,使用它你可以编译 mxml 文件,你可以使用 mxmlc 编译一个 hello.mxml 文件,例如: mxmlc --show-actionscript-warnings=true --strict=true c:/appDir/hello.mxml 在这个例子中 flexInstallDir 是 flex 的安装目录,appDir 是 hello.mxml 所在的文件夹。 编译的结果 swf 文件也就是 hello.swf 文件和 hello.mxml 在同一文件架下。 mxml 标签和 actionscript 类的关系 adobe 用 actionscript 类库来实现 flex,这个类库包含组件(容器和控件),管理类,数据服务类,和其 他各种各样的类。你可以使用 mxml 和 actionscript 语言和这些类库来开发你的应用。mxml 标签与 actionscript 类及类的属性保持一致,flex解析 mxml 标签,将其编译成一个swf 文件,这个编译好的swf 文件中就有 mxml 文件对应的 actionscript 对象。 例如 flex 提供了 actionscript 的 button 类,这个类定义了 flex 的 button 控件,你在 mxml 中,可以这 样创建一个 button 控件 当你使用 mxml 标签声明一个控件的时候,你创建了一个这个空间类的实例。这条 mxml 语句创建了一个 button 对象,并且初始化这个 button 空间的 label 属性为字符串“submit”.一个 mxml 标签与和它对应 的 actionscript 类的类文件中使用同样的命名规范。 在 mxml 标签中使用 id 属性 mxml 标签中有一个可选的 id 属性,这个属性的取值在整个 mxml 文件中必须唯一。如果一个标签含有 id 属性,你可以在 actionscript 文件中引用这个对象, 这段代码会使 mxml 编译器自动生成一个 public 变量叫做 myText,这个变量是一个 textInput 实例的引用。 这个自动生成的变量可以让你在 actionscript 中,方便的访问组件的实例。你可以在任何 acitonscript 文件或 script 块中,使用 id 来应用这个 textInput 空间的实例。通过引用一个组件的实例,你可以修改 这个组建的属性,调用它的方法。因为每一个 id 值在一个 mxml 文件中是唯一的,一个文件中所有的对象 又是一个命名空间的一部分,你可以使用这个对象的父对象加.符号来访问这个对象。 使用 xml 命名空间 在一个 xml 文档中,标签会被分配到一个命名空间中,命名空间可以使你在一个文档中,引用属于不同集 合的 xml 标签。 在 mxml 标签中的 xmlns 属性指定了一个 xml 的命名空间,使用默认的命名空间可以不用使用前缀。使用一 些额外的标签,需要指定一个标签的前缀并且指定一个命名空间。例如,下面这个标签 指定了 mxml 命名空间中的标签使用 mx:这个前缀。这个 mxml 命名空间的 url 是 http://www.adobe.com/2006/mxml。 xml 命名空间使你可以使用不在 mxml 命名空间中的用户自定义标签。下面的例子演示了一个使用了 CustomBox 用户标签的应用,命名空间的值 containers.boxes.*指定了这个名叫 CustomBox 的 mxml 组件在 containers/boxes 目录下。 containers/boxes 是存放应用文件的目录的子目录,或者是在 flex-config.xml 中声明过的 actionscript 源文件的路径的子目录。如果在这两个地方都可以找到对应的文件,flex 优先使用存放应用文件的目录的 子目录下的对应的文件。前缀的名称是任意的,但是你怎么声明前缀的,在使用用户自定义标签的时候, 就要那样给你的标签加前缀。当使用的组件在一个 swc 文件中的时候,这个 swc 文件就相当于一个目录。 一个 swc 文件对于 flex 组件来说就是一个归档文件(压缩文件)。这样,flex 开发人员可以很简单的使 用 swc 文件。 命名 mxml 文件 mxml 文件名必须符合以下的命名规则: •文件名必须是一个 actionscript 的标识符,也就是说必须以字母或者下划线开头,后面接字母,数字, 下划线。 •文件名不能和 actionscript 类名,组件的 id 值,或者应用的名称相同。不要使用与 mx 命名空间下的 mxml 标签名称相同的文件名。 •文件名必须要以小写的.mxml 为扩展名。 一个 mxml 标签与其对应的 actionscript 类使用相同的命名规则。类名以大写字母开头,使用大写字母分 割每一个单词。当一个标签与一个 actionscript 类对应,标签的属性就和这个类的属性和事件相对应。 设置组件的属性 在一个 mxml 中,你可以这样设置大部分组件的属性: Xml 代码 1. 你可以用子标签设置组建的属性: Xml 代码 1. 2. 50 3. 25 4. Hello World 5. 建议在设置一个复合对象的属性的时候使用子标签,因为很难指定一个复合对象作为某个标签的属性。在 下面的例子中,使用子标签来设置一个 combobox 控件的 data provider 为一个 ArrayCollection 对象。 Xml 代码 1. 2. 3. 4. AK 5. AL 6. AR 7. 8. 9. 使用子标签的唯一限制就是子标签的命名空间的前缀需要和所属组件的命名空间前缀保持一致。 组件的属性是以下这些类型的一种: •标量属性,如 number,string •标量值的数组,如 number 的数组,string 的数组 •actionscript 对象 •actionscript 对象的数组 •ActionScript 的属性 •XML adobe 推荐使用标量类型作为标签的属性,因为一旦使用复合对象做标签值,如 actionscript 对象,将会 使用到子标签。 设置标量属性 使用常量来设置属性 许多组件的有效的属性值被定义为静态常量,这些静态常量被定义在 actionscript 类中。在 mxml 中,你 既可以使用静态常量来设置属性的值,也可以使用静态常量的值来设置属性的值。就象下面这个例子: Xml 代码 1. 2. 3. ... 4. 5. 6. 7. ... 8. HBox 容器定义了一个 horizontalScrollPolicy 的属性,这个属性定义了容器水平滚动条的操作类型。在 这个例子中,指定这个 horizontalScrollPolicy 为 off,禁用了水平滚动条。 在第一个例子中,使用一个名为 OFF 的静态常量来设置 horizontalScrollPolicy 属性。这个属性定义在 ScrollPolicy 类中。在 mxml 中,需要使用数据绑定的语法来设置这个属性的值。(就是那个{}).这样做 的好处是 flex 编译器可以识别不正确的属性值,并且在变异时报错。 此外,你可以用这个静态常量的值来设置 horizontalScrollPolicy 属性值。OFF 的值是“off”。当使用 静态常量的值来设置属性值,此时 flex 编译器不能确定你是不是使用了这个属性不支持的值。如果不正确 的设置了这个属性,你只有到代码运行到这里的时候,你才会得到一个运行时错误。 在 actionscript 中,应该总是使用静态常量来设置属性值,就象下面这个例子: Js 代码 1. var myHBox:HBox = new HBox(); 2. myHBox.horizontalScrollPolicy=ScrollPolicy.OFF; 在设置属性的时候可以使用\对字符进行转义 如, Xml 代码 1. 2. 3. 4. 将 label 的 text 设置为{}. mxml 编译器自动将 mxml 文件中作为某个字符串类型的属性的"\"替换为'\\'. 在字符串中使用换行符 在字符串类型的属性中插入一个换行符有两种方法: •在 mxml 文件中使用 来替换换行符。 •在一个 actionscript 变量中使用"\n"来替代换行符,在用这个变量来初始化 mxml 的属性。 使用 编码来插入换行符 使用"\n"来替代换行符,在用这个变量来初始化 mxml 的属性, Xml 代码 1. 2. 3. 7. 8. 9. 注意,在这个例子中在属性定义以前,包含了[Bindable]这个元数据标签,这个元数据标签指定了 mytext 属性可以用来作为数据绑定的表达式。在运行时,当数据源属性发生变化的时候,数据绑定会自动的 copy 一个对象的属性源的值,放入目标对象的属性。 如果你指定了这个元数据标签,但是这个属性实际上并没有在数据绑定中使用,在编译时,编译器就会给 你一个警告信息。 设置一个标量数组的值 当一个类的一个属性是一个数组的时候,你可以使用子标签来设置这个属性。在下面这个例子中,组件有 一个 dataprovider 属性需要一个数组类型的值: Xml 代码 1. 2. 3. 4. 94062 5. 14850 6. 53402 7. 8. 9. 包裹着数组元素的标签是可选的。因此,你也可以这样写: Xml 代码 1. 2. 3. 94062 4. 14850 5. 53402 6. 7. 在这个例子中,dataprovider 属性的类型是一个数组,flex 会自动的转换 3 个 nubmer 为一个含有三个元 素的数组。 组件的开发者在定义这个组件的属性为数组的时候还需要添加一些说明信息,在上面的例子中,因为我们 指定的是一个 number 的数组,如果一个开发者指定 dataprovider 属性只能是 string 类型的元素,这个例 子将会引起一个编译错误。 如果你想定义一个只有一个元素数组,那么就不能省略: Xml 代码 1. 2. 3. 4. 94062 5. 6. 7. 设置对象的属性 当一个组件的属性的值的类型是某一个对象的时候,可以使用子标签去表示这个属性,就象下面这个例子: Xml 代码 1. 2. 3. 4. 5. 在下面这个例子中,我们用 actionscript 定义了一个 address 对象的类。PurchaseOrder 组件将使用这 个类作为它的一个属性 Js 代码 1. class Address 2. { 3. public var name:String; 4. public var street:String; 5. public var city:String; 6. public var state:String; 7. public var zip:Number; 8. } Xml 代码 1. import example.Address; 2. class PurchaseOrder { 3. public var shippingAddress:Address; 4. public var quantity:Number; 5. ... 6. } 在 mxml 中,需要这样定义 PurchaseOrder 组件: Xml 代码 1. 2. 3. 4. 5. 如果 shippingAddress 属性的类型是 Address 的子类(比如 DomesticAddress),可以象下面这个例子一 样,去声明属性值: Xml 代码 1. 2. 3. 4. 5. 如果对象的属性是 object 类型的,你还可以使用标签指定一个匿名的对象: Js 代码 1. class ObjectHolder { 2. public var value:Object 3. } Xml 代码 1. 2. 3. 4. 5. 设置对象数组类型的属性 当一个组件的属性的类型是一个对象的数组,应该在 mxml 中这样设置这个属性: Xml 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 在下面这个例子中,属性的类型是一个 ListItem 对象的数组,每一个 ListItem 对象有 label 和 data 两 个属性。 Xml 代码 1. 2. 3. 4. 5. 6. 7. 8. 你还可以指定一个匿名对象: Xml 代码 1. 2. 3. 4. 5. 6. 7. 8. 在这里也是可以选的: Xml 代码 1. 2. 3. 4. 5. 6. 设置包含 xml 数据的属性 如果一个组件的属性的类型是一个 xml 数据,或者是一个 xml 文档的片段,可以这样设置这个属性: Xml 代码 1. 2. 3. 4. 5. 6. ... 7. 8. ... 9. 10. 11. 12. 在 MyComponent 对象中,value 属性的类型是一个 xml 类型的。 在 mxml 中设置风格和效果的属性 在 mxml 标签中,一个风格或效果的属性不同于其他的属性,因为一个风格或效果的属性与一个 actionscript 的风格或效果对应,而不是同一个 actionscript 类的属性对应。在 actionscript 中,你可 以使用 setStyle(stylename, value)方法来设置风格的属性,而不是使用 object.property=value 这样的 格式来设置。在 actionscript 中,你可以使用[Style]或者[Effect]元数据标签来定义一个风格或者效果 的属性,而不是当风格或效果的属性是一个 actionscript 变量,使用 setter/getter 方法去定义。可以象 下面这个例子一样,在 mxml 中去设置 fontFamily 风格的属性: Xml 代码 1. 这段 mxml 代码等价于这段 actionscript 代码: Js 代码 1. myText.setStyle("fontFamily", "Tahoma"); 在 mxml 中设置事件的属性 可以通过设置一个 mxml 标签的事件属性来指定一个事件的事件监听器,设置这个属性就相当于在 actionscript 代码中使用 addEventListener() 方法去设置一个事件监听器。你可以使用[Event]元数据标 签在 actionScript 类中定义一个事件属性,而不是把事件属性当作一个变量使用 setter/getter 方法去定 义事件。在 mxml 中,可以这样设置 creationComplete 事件属性: Xml 代码 1. 与这段 mxml 代码等价的 actionscript 代码是: Js 代码 1. myText.addEventListener("creationComplete", creationCompleteHandler); 指定一个 url 值 有些 mxml 标签需要一个 url 或者外部文件作为这个标签的一个属性值,如。可以使用 标签的 source 属性来引用一个外部文件,或者在标签体里面直接书写 actionscript 代码。 注意:在使用 source 属性引用外部文件的时候,这个外部文件中,不能有类的声明在里面,只能是一段面 向过程的代码。 mxml 支持下面这几种 url 格式: •绝对的 url, Xml 代码 1. •一个运行时相对于 java web 应用的上下文根的路径, Xml 代码 1. •一个在编译时相对于 java web 应用的上下文根的路径, Xml 代码 1. •相对于当前文件位置的路径, Xml 代码 1. 指定一个正则表达式的值 在 mxml 中可以这样指定一个属性类型为 regexp(正则表达式)类型的值: "/pattern/flags" 在'/'之中的 pattern 指定了这个正则表达式,两个'/'都是必须的。flags (可选的)指定了这个正则表 达式的一些标志。 例如,一个 mxml 组件的 regExpression 属性是一个正则表达式类型,你可以这样设置它的值: Xml 代码 1. 还可以使用子标签来设置: Xml 代码 1. 2. /\Wcat/gi 3. 正则表达式中的 flags 部分是可选的,所以你也可以这样设置: Xml 代码 1. 使用编译器标签 不直接与 actionscript 对象或对象的属性对应的标签就是编译器标签,以首字母大写开头的编译器标签有: • 全部字母小写的编译器标签有: • mxml 标签的规则 mxml 有以下语法要求: •id 属性在任何标签中都不是必须要设置的。 •在根标签上不允许设置 id 属性。 •Boolean 类型的属性只能接受 true 和 false 为合法的值。 •标签同时需要设置 source 和 destination 属性。 •不能设置 id 属性。 •标签需要设置 wsdl 属性或者的 destination 属性,但不能两个属性都设置。 •标签需要设置 source 属性或者的 named 属性,但不能两个属性都设置。 •标签需要设置 url 属性或者的 destination 属性,但不能两个属性都设置。 •标签需要一个 name 属性,而且不允许一个 name 对应多个对象。 •标签不能设置 id 属性。 •标签需要一个 name 属性,而且不允许一个 name 对应多个对象。 •标签不能设置 id 属性。  
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

sunwe1987

贡献于2016-02-27

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf