使用组件、绑定和自定义格式程序

自定义格式程序有助于以特定的方式设置复杂数据的格式。您还可以使用自定义格式设置来帮助在一个组件(如 DataGrid)内显示图像、HTML 格式文本或其它组件。下面的示例说明自定义格式程序的用途。

在文档中使用自定义格式程序:

  1. 创建一个新的 FLA 文件,并将 DataBindingClasses 类添加到库("窗口">"公用库">"类")。
  2. 将 DateChooser 组件的副本拖至舞台上,并为其指定实例名称 my_dc
  3. 将 Label 组件的副本拖至到舞台,请为其指定实例名称 my_lbl
  4. 插入一个新的图层,并命名为 actions
  5. 在动作图层的第 1 帧中添加以下 ActionScript 代码:
    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 组件中。

  6. 将该 Flash 文档在硬盘上的恰当位置保存为 customformat.fla

    (下一练习中还要使用它。)

  7. 选择"控制">"测试影片"来测试该文档。

    尝试更改 Calendar 组件中的日期,就会看到当前选定的日期出现在 Label 组件中。Label 组件不够宽,无法显示整个日期,所以 Flash 截短了文字。

  8. 关闭测试 SWF 文件并返回到创作环境。

    要么在舞台上重新调整 Label 组件大小,要么选择 Label 组件,在属性检查器的"参数"选项卡中将 autoSize 属性设置为 left

  9. 选择"控制">"测试影片"再次测试该文档。

    现在文本字段会显示完整的日期,尽管不大美观而且缺少格式设置。根据您的时区和选定的日期,日期显示可能类似于下面的样子:Thu Nov 4 00:00:00 GMT-0800 2004

    虽然绑定正常并显示 selectedDate 属性,但这些日期在用户友好方面表现不甚理想。没有人希望看到时区偏移,您甚至可能也不希望显示时、分和秒。您需要一种设置日期格式的方式,以使日期更具可读性,不再那么呆板。自定义格式程序对于设置文本格式特别有用。

使用 CustomFormatter 类设置数据格式

CustomFormatter 类定义两个方法 format()unformat(),能将数据值在特定数据类型和字符串之间进行转换。默认情况下,这些方法不会执行任何操作;您必须在 mx.data.binding.CustomFormatter 的子类中实现它们。CustomFormatter 类让您能够将数据类型转换为字符串并再转换过来。在这种情况下,您会希望将 DateChooser 组件的 selectedDate 属性转换为一种格式漂亮的字符串(在值复制到 Label 组件中时)。

下面的示例说明如何创建自定义格式程序,以将日期显示为 NOV 4, 2004,而不是显示为默认日期字符串。

注意

您需要完成使用组件、绑定和自定义格式程序中的练习,然后才能开始此练习。

使用 CustomFormatter 类设置数据的格式:

  1. 选择"文件">"新建",然后选择"ActionScript 文件",创建一个新的 AS 文件。
  2. 选择"文件">"另存为",将新文件保存为 DateFormat.as
  3. 在"脚本"窗口中输入下面的代码:
    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 无法定位该类时发生,因为这一点,语法检查失败。

  4. 保存 DateFormat.as 文件。
  5. 打开使用组件、绑定和自定义格式程序中的练习中的 customformat.fla。确保将 DateFormat.as 保存或复制到与此文件相同的目录中。
  6. 在 customformat.fla 中,修改动作图层的第 1 帧中的 ActionScript 代码,以与下面的代码匹配:
    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 类设置绑定时的端点格式。

  7. 保存对文档的更改并选择"控制">"测试影片"来测试您的代码。