日期:2014-05-16  浏览次数:20453 次

EXTJS日期时间选择控件(精确到秒)

一。一些废话

近日来,有几个项目用到了EXTJS作为Web前端。也看到了一些童鞋苦苦在网上寻觅可以选择时间的控件,由于EXTJS版本差异较大,利用官方3.2的Demo制作了一个可以选择到秒的时间控件,该控件只能够用于ExtJs2.2以上的版本。经过测试ExtJs2.02版本不适用该控件,如果你还在使用2.02这个版本或者更老,请绕道。废话不说了,看代码:

二。文件明细:

Spinner.js

SpinnerField.js

DateTimeField.js

三。各文件详解

1.Spinner.js

EXTJS个版本略有不同,最后的文件解压后请覆盖源文件。这里不做详细介绍。

2.SpinnerField.js

EXTJS个版本略有不同,最后的文件解压后请覆盖源文件。这里不做详细介绍。

3.DateTimeField.js

// 命名空间归属
Ext.ns('Ext.ux.form');
// 在该命名空间内,开辟一个名为TimePickerField的区域,我们可以当他是一个时间选择器
Ext.ux.form.TimePickerField = function(config){
	// 调用构造方法,也就是说定义了他的所属--this
	// this指的是什么呢?这里需要注意,首先这个东东属于这个类(对象),其次这个类(对象)在没有被调用之前或者实例之前是不会被构造的
	// 那么这个this实际上是指我们实例化后的datetimefield
    Ext.ux.form.TimePickerField.superclass.constructor.call(this, config);
}
// 给刚刚定义的TimePickerField加点菜吧。
// 首先它继承与Ext.form.Field,是一个扩展
Ext.extend(Ext.ux.form.TimePickerField, Ext.form.Field, {
    defaultAutoCreate: {
        tag: 'div'// 定义了一个DIV标签
    },
    cls: 'x-form-timepickerfield',// 它的样式
    hoursSpinner: null,// 属性:小时选择器
    minutesSpinner: null,// 属性:分钟选择器
    secondsSpinner: null,// 属性:秒选择器
    spinnerCfg: {
        width: 40// 选择器的宽度定位40px
    },
	
	// 约束:选择数值约束,如果小于最小值该如何,如果大于最大值该如何,这里的处理方式我详细说明一下(这个约束是触发的,我们输入的值或者我们点击上下箭头选择的值后都会进入该约束检查。)
    spinnerFixBoundries: function(value){
		// 这里有可能会造成不解,我解释一下。
		// 如果我们选择秒的时候,有一个向上的箭头和向下的箭头,如果我点击向上的箭头则秒数加1,点击向下的箭头则秒数减1。
		// 如果我选择了59秒后,点击向上的箭头,由于时间秒数约束,不可能出现60,那我们要怎么办?会如何?当然是,58,59,0,1这样的序列
		// 所以最大值定义为59,如果超过59那么秒数归零,就是这个逻辑。
        if (value < this.field.minValue) {
            value = this.field.maxValue;
        }
        if (value > this.field.maxValue) {
            value = this.field.minValue;
        }
		// 这里返回了一个带有精度的值
        return this.fixPrecision(value);
    },
	// 渲染,这个没什么可说的了所有的渲染都差不多是位置和范围之类的
    onRender: function(ct, position){
        Ext.ux.form.TimePickerField.superclass.onRender.call(this, ct, position);
        this.rendered = false;
        this.date = new Date();
		// 定义一个对象,他即将有三个属性,时分秒数值,往下看。
        var values = {};
		// 如果实例时已经被设定了初始值,那么将这些值赋予values这个对象中。
		// 再将这些值表示在时分秒选择器中
        if (this.value) {
            values = this._valueSplit(this.value);
            this.date.setHours(values.h);
            this.date.setMinutes(values.m);
            this.date.setSeconds(values.s);
            delete this.value;
        }
		// 如果实例时没被设定了初始值,简单了,时分秒选择器的初始值就不用改变了,只要values得到这些值备用即可
        else {
            values = {
                h: this.date.getHours(),
                m: this.date.getMinutes(),
                s: this.date.getSeconds()
            };
        }
		// 定义一个外围包裹,就是想把时分秒这三个选择器给包起来成为一组,下面会实例这三个选择器的,往下看。
        var spinnerWrap = Ext.DomHelper.append(this.el, {
            tag: 'div'
        });
        var cfg = Ext.apply({}, this.spinnerCfg, {
            renderTo: spinnerWrap,
            readOnly: this.readOnly,
            disabled: this.disabled,
            listeners: {
                spin: {
                    fn: this.onSpinnerChange,
                    scope: this
                },
                valid: {
                    fn: this.onSpinnerChange,
                    scope: this
                },
                afterrender: {
                    fn: function(spinner){
                        spinner.wrap.applyStyles('float: left');
                    },
                    single: true
                }
            }
        });
		// 接下来实例(Ext.ux.form.SpinnerField)了几个选择器,时分秒。
        this.hoursSpinner = new Ext.ux.form.SpinnerField(Ext.apply({}, cfg, {
            minValue: 0,
            maxValue: 23,
            cls: 'first',
            value: values.h
        }));
        this.minutesSpinne