学习 Flash 中的 ActionScript 2.0 |
|
|
|
| 用 ActionScript 创建交互操作 > 使用 ActionScript 创建运行时数据绑定 > 使用组件、绑定和自定义格式程序 | |||
自定义格式程序有助于以特定的方式设置复杂数据的格式。您还可以使用自定义格式设置来帮助在一个组件(如 DataGrid)内显示图像、HTML 格式文本或其它组件。下面的示例说明自定义格式程序的用途。
在文档中使用自定义格式程序: import mx.data.binding.*; var src:EndPoint = new EndPoint(); src.component = my_dc; src.property = "selectedDate"; src.event = "change"; var dest:EndPoint = new EndPoint(); dest.component = my_lbl; dest.property = "text"; new Binding(src, dest);
此代码在 DateChooser 的 selectedDate 属性和舞台上 Label 组件的 text 属性之间创建绑定。每次在日历上单击新日期时,选定的日期就会出现在 Label 组件中。
(下一练习中还要使用它。)
尝试更改 Calendar 组件中的日期,就会看到当前选定的日期出现在 Label 组件中。Label 组件不够宽,无法显示整个日期,所以 Flash 截短了文字。
要么在舞台上重新调整 Label 组件大小,要么选择 Label 组件,在属性检查器的"参数"选项卡中将 autoSize 属性设置为 left。
现在文本字段会显示完整的日期,尽管不大美观而且缺少格式设置。根据您的时区和选定的日期,日期显示可能类似于下面的样子:Thu Nov 4 00:00:00 GMT-0800 2004
虽然绑定正常并显示 selectedDate 属性,但这些日期在用户友好方面表现不甚理想。没有人希望看到时区偏移,您甚至可能也不希望显示时、分和秒。您需要一种设置日期格式的方式,以使日期更具可读性,不再那么呆板。自定义格式程序对于设置文本格式特别有用。
CustomFormatter 类定义两个方法 format() 和 unformat(),能将数据值在特定数据类型和字符串之间进行转换。默认情况下,这些方法不会执行任何操作;您必须在 mx.data.binding.CustomFormatter 的子类中实现它们。CustomFormatter 类让您能够将数据类型转换为字符串并再转换过来。在这种情况下,您会希望将 DateChooser 组件的 selectedDate 属性转换为一种格式漂亮的字符串(在值复制到 Label 组件中时)。
下面的示例说明如何创建自定义格式程序,以将日期显示为 NOV 4, 2004,而不是显示为默认日期字符串。
|
注意 |
您需要完成使用组件、绑定和自定义格式程序中的练习,然后才能开始此练习。 |
使用 CustomFormatter 类设置数据的格式:
class DateFormat extends mx.data.binding.CustomFormatter {
function format(rawValue:Date):String {
var returnValue:String;
var monthName_array:Array = ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];
returnValue = monthName_array[rawValue.getMonth()]+" "+rawValue.getDate()+", "+rawValue.getFullYear();
return returnValue;
}
}
第一部分代码定义名为 DateFormat 的新类,该类扩展了 mx.data.binding 包中的 CustomFormatter 类。请记住,Flash 将编译 DataBindingClasses 组件文件中的绑定类,因此您不能在 Flash 安装目录的 Classes 文件夹中直接查看或找到这些类。
您唯一使用的方法是 format() 方法,它将日期实例转换成一种自定义字符串格式。下一步是创建月份名称数组,以便让最终结果看上去更接近 NOV 4, 2004,而不是默认的日期格式。请记住,在 Flash 中数组都从零开始,如果 rawValue.getMonth() 的值返回的是 1,它代表的是 2 月,不是 1 月(因为 1 月是第 0 月)。其余代码通过连接值并返回 returnValue 字符串而构建了自定义格式的字符串。
使用已编译剪辑中的类会产生一个问题,从上面的代码片断中可看到此问题。因为扩展了位于 DataBindingClasses 类中的一个类,但该类不是随时可供 Flash 使用,所以在前面的类中检查语法时会遇到下面的错误:
**Error** <path to DateFormat class>\DateFormat.as: Line 1: The class 'mx.data.binding.CustomFormatter' could not be loaded.
class DateFormat extends mx.data.binding.CustomFormatter {
Total ActionScript Errors: 1 Reported Errors: 1
您的代码可能没问题。此问题会在 Flash 无法定位该类时发生,因为这一点,语法检查失败。
import mx.data.binding.*;
var src:EndPoint = new EndPoint();
src.component = my_dc;
src.property = "selectedDate";
src.event = "change";
var dest:EndPoint = new EndPoint();
dest.component = my_lbl;
dest.property = "text";
new Binding(src, dest, {cls:mx.data.formatters.Custom, settings:{classname:"DateFormat", classname_class:DateFormat}});
这一次您定义了一个 customFormatter 对象,它将告诉 Flash 您正在使用新创建的 DateFormat 类设置绑定时的端点格式。
|
|
|
|