首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Dojo 日期控件的国际化和集成(2)

Dojo 日期控件的国际化和集成(2)

Dojo 日期控件的国际化策略上一节对 Dojo 日期控件做了一个整体介绍,我们了解了 Dojo 的类层次结构以及如何使用 Dojo 。本节主要介绍 Dojo 日期控件对时间的处理以及对国际化的支持。
Dojo 日期控件对时间的处理由于大部分 dojo 控件都继承自同一个基类,所以他们拥有相似的行为方式:
  • 都通过 onfocus 事件来触发 dojo 控件;
  • 如果继承自 dijit.form.ValidationTextBox,都通过 onkeyup 事件对值进行校验;
  • 都通过 onBlur 事件来关闭 dojo 控件等等。
日期控件同样具有上述行为,相应时间分别为:
  • Onfocus:打开日历窗口,并对当前值进行校验;
  • Onkeyup:对当前值进行校验;
  • onBlur:关闭日历窗口,并对当前值进行校验。
了解了 Dojo 日期控件的事件,下面将介绍我们 Dojo 提供的用于数据处理的方法 setValue() 和 getValue() 。
setValue 方法
在日期控件初始化时会给其传递一个 Date 类型的初始值,在初始化方法中正是通过调用 setValue() 来对其进行付值的 setValue(Date):在该方法中会进行两个操作:用 format 属性定义的方法将 Date 类型数据转换为字符串,存到 textbox 的 value 属性中,textbox 是我们可以在页面看到的 dojo 日期控件中的文本框;用 serialize 属性定义方法将 Date 类型数据转换为字符串存到 valueNode 的 value 属性中,valueNode 既为 textbox 所对应的隐藏域。 dijit.form.TimeTextBox 中默认的 format 方法为 dojo.date.locale.format, serialize 方法为 dojo.date.stamp.toISOString 。
getValue 方法
getValue() 方法返回的是日期控件的值类型为 Date 。上面提到 dojo 日期控件的两个域 textbox 和 valueNode 中存储的都是字符串类型数据,因此该方法中会将其转换为 Date 类型 .dijit.form.TimeTextBox 默认使用的是 dojo.date.locale.parse (/*String*/value, /*Object?*/options) 方法该方法会根据指定的 locale( 在 djConfig 中指定 ) 和格式 ( 在输入参数 selector 属性中指定 ) 来将 textbox 中的值转换为 Date 类型。
Dojo 日期控件对国际化的支持Dojo 日期控件对国际化的支持主要集中在 dojo.date 包下的两个类 dojo.date.locale 和 dojo.date.stamp 。
dojo.date.stamp
基于 ISO-8601 标准,在 Date 和 String 类型之间进行转换。 ISO-8601 支持的格式如下:
1
2
3
4
5
6
7
8
日期
    yyyy
    yyyy-MM
    yyyy-MM-dd
时间
    THH:mm
    THH:mm:ss
    THH:mm:ss.SSS




dojo.date.stamp 类中包含的方法为:
dojo.date.stamp.fromISOString
用于把 String 转为 Date.
例 : dojo.date.stamp.fromISOString("2005-06-30T08:05:00");
转换后的 Date 类型在 Firefox 下用 Firebug 打印的结果如下 :
图 6. Dojo 实际存储的日期值而 dojo.date.stamp.fromISOString("2005-06-30 T08:05:00");
因为不符合 ISO-8601 标准,将产生一个空的 Date 对象。
dojo.date.stamp.toISOString
用于把 Date 转为 String
例:dojo.date.stamp.toISOString(new Date())
上面提到过,如果采用声明方式生成 Dojo 日期控件,则 Dojo 会用 dojo.date.stamp.fromISOString 方法来对其初始化,因此我们在给控件复值的时候必须遵循 ISO-8601 标准,否则将会生成一个空值 . 如何在初始化时,让 Dojo 接受非标准格式的数据呢?我们知道,Dojo 日期控件用两个域来存放数据 :textbox 和 valueNode,无论初始化时它如何对数据进行处理,最终的结果都是存在这两个域里,所以我们可以将我们的值直接复给这两个域,这样即使 dojo.date.stamp.fromISOString() 方法转换失败,我们也能将值赋给 Dojo 。例如:
清单 4. 直接给 dojo 隐藏域赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script type="text/javascript">
    dojo.require("dojo.parser");
    dojo.require("dojo.date.stamp");
    dojo.require("dojo.date.locale");
    dojo.require("dijit.form.TimeTextBox");         
    function createDojo(inputId){
        var obj = dojo.byId(inputId);
        var value = obj.value;
        obj.setAttribute("dojoType", "dijit.form.TimeTextBox");
        dojo.parser.instantiate([obj]);
        obj = dijit.byId(inputId);
        obj.textbox.value = value;
        obj.valueNode.value = value;
    }
</script>




当然 Dojo 并不推荐我们这样做,毕竟它已经向我们提供了对其值进行操作的接口:setValue() 和 getValue() 。但由于声明方式中我们没有机会接触到这两个方法,所以如果不采用强制复值的方法,我们只能通过编程方式来生成 Dojo 。在编程方式中,我们直接传递一个 Date 对象给 Dojo 而非字符串,所以在传递之前,可以自己定义转换方式来将 String 转为 Date 。
清单 5. 通过 dojo 提供的接口来赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script type="text/javascript">
<script type="text/javascript">
    dojo.require("dojo.parser");
    dojo.require("dojo.date.stamp");
    dojo.require("dojo.date.locale");
    dojo.require("dijit.form.TimeTextBox");
</script>
<body class="tundra">
    <input type="text" id="text001">
    <script>
        new dijit.form.TimeTextBox({"id":"text002","value":dojo.date.locale.parse
        (" 下午 2:22",{selector:"time"})},dojo.byId("text001"));
        </script>
</body>




此处用到了 dojo.date.locale.parse 方法,下面会详细介绍。
Dojo.date.locale
返回列表