Ext JS 4实现带星期的日期选择控件实战一

作者:技术拾光

时间:2026-06-10

浏览:300

前言 Ext JS 3 和 Ext JS 4 都内建了日期选择组件(早期版本同样如此)。但在某些使用场景下,用户需要查看“周数”,即当前日期属于一年中的第几周。遗憾的是,Ext 官方并未提供直接配置选项(例如在 Ext.picker.Date 上增加一个 showWeek 开关)。 现有的解法 在网

文章目录

前言

Ext JS 3 和 Ext JS 4 都内建了日期选择组件(早期版本同样如此)。但在某些使用场景下,用户需要查看“周数”,即当前日期属于一年中的第几周。遗憾的是,Ext 官方并未提供直接配置选项(例如在 Ext.picker.Date 上增加一个 showWeek 开关)。

前言

现有的解法

在网络上搜索后,找到两个方案:

  • enikao.net 的方案:仅在 IE 下正常工作,其他浏览器中无法显示。果断放弃。
  • lubber.de 的方案:支持 Ext JS 2 和 3,但不支持 4。原本以为将扩展升级到 4 不算困难(毕竟有升级经验),但折腾了大半天后还是放弃了——Ext JS 3 到 4 的日期组件改动较大,原来的表格结构(tr/td)变成了大量 div 和 a 元素,class 名也全部更换。升级阻力过大,索性自己动手实现。

Ext JS 4 日期控件扩展

先看代码:

复制代码 代码如下:
/********************************* * @author: oscar999 * @Description: New Widgets Extend from Ext * @verion: V1.0 **********************************/ /** * Date Picker with Week */ Ext.define('Ext.ux.DatePickerWithWeek',{ extend: "Ext.picker.Date", alias : "widget.datepickerwithweek", width: 197, numWeeks: 6, renderTpl:[ '
', '', '', '', '', '', '', '', '', '', '', '{#:this.isEndOfWeek}', '{#:this.isBeginOfWeek}', '', '', '', '
', '
Wk
', '
', '
{.:this.firstInitial}
', '
', '', '
', '', '', '', '
', { firstInitial: function(value) { //alert(value); return Ext.picker.Date.prototype.getDayInitial(value); }, isBeginOfWeek: function(value){ //value--; //value--; var end = (value === 1 || (value-1)%7 === 0); return end '' : ''; }, isEndOfWeek: function(value) { value--; var end = value % 7 === 0 && value !== 0; return end '' : ''; }, renderTodayBtn: function(values, out) { Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(), out); }, renderMonthBtn: function(values, out) { Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(), out); } } ], fullUpdate: function(date){ this.callParent([date]); var me = this; var weekNodes = me.weekNodes; var curWeekStart = Ext.Date.clearTime(new Date(date.getFullYear(), date.getMonth(), 1)); var begMonWeek = Ext.Date.getWeekOfYear(curWeekStart); var firstDayOfMonth = Ext.Date.getFirstDayOfMonth(curWeekStart); if(firstDayOfMonth===0) { begMonWeek +=1; } for(j=0;j

原理很简单:

  1. 改写 renderTpl,在表头增加一列用于显示“Wk”(周数)。
  2. 改写 fullUpdate,利用 Ext.Date.getWeekOfYear 方法计算当前月第一天所在的周数,然后依次填充到对应单元格中。
  3. 在 onRender 中需要注意:click 事件的 fn 不能直接写 me.handleDateClick(否则选择日期时会触发两次),必须用一个空函数 function(){} 代替。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章