【ExtJS】自定义组件datetimefield(一)



  目的:

  ExtJS中提供了下拉日期选择控件Ext.form.field.Date与下拉时间选择控件Ext.form.field.Time。不过没有一个在选择日期时选择时间的控件datetimefield。目的就是运用自定义组件的方法,来扩展下拉日期选择控件Ext.form.field.Date,在下拉框中添加时间选择的组件。目标效果:




第一步:继承Ext.picker.Date,创建My.picker.DateTime类

 1 Ext.define(‘My.picker.DateTime‘, {
 2     extend: ‘Ext.picker.Date‘,
 3     alias: ‘widget.datetimepicker‘,
 4     okText:‘确定‘,
 5     okTip:‘确定‘,
 6
 7     renderTpl: [
 8         ‘<div id="{id}-innerEl" data-ref="innerEl" role="grid">‘,
 9             ‘<div role="presentation" class="{baseCls}-header">‘,
10                 ‘<a id="{id}-prevEl" data-ref="prevEl" class="{baseCls}-prev {baseCls}-arrow" role="button" title="{prevText}" hidefocus="on" ></a>‘,
11                 ‘<div id="{id}-middleBtnEl" data-ref="middleBtnEl" class="{baseCls}-month">{%this.renderMonthBtn(values, out)%}</div>‘,
12                 ‘<a id="{id}-nextEl" data-ref="nextEl" class="{baseCls}-next {baseCls}-arrow" role="button" title="{nextText}" hidefocus="on" ></a>‘,
13             ‘</div>‘,
14             ‘<table id="{id}-eventEl" data-ref="eventEl" class="{baseCls}-inner" cellspacing="0" role="grid">‘,
15                 ‘<thead role="presentation"><tr role="row">‘,
16                     ‘<tpl for="dayNames">‘,
17                         ‘<th role="columnheader" class="{parent.baseCls}-column-header" title="{.}">‘,
18                             ‘<div class="{parent.baseCls}-column-header-inner">{.:this.firstInitial}</div>‘,
19                         ‘</th>‘,
20                     ‘</tpl>‘,
21                 ‘</tr></thead>‘,
22                 ‘<tbody role="presentation"><tr role="row">‘,
23                     ‘<tpl for="days">‘,
24                         ‘{#:this.isEndOfWeek}‘,
25                         ‘<td role="gridcell" id="{[Ext.id()]}">‘,
26                             // The ‘#‘ is needed for keyboard navigation
27                             ‘<a href="#" role="button" hidefocus="on" class="{parent.baseCls}-date"></a>‘,
28                         ‘</td>‘,
29                     ‘</tpl>‘,
30                 ‘</tr></tbody>‘,
31             ‘</table>‘,
32             ‘<tpl if="showToday">‘,
33                 ‘<div id="{id}-footerEl" data-ref="footerEl" role="presentation" class="{baseCls}-footer">{%this.renderTodayBtn(values, out)%}</div>‘,
34             ‘</tpl>‘,
35         ‘</div>‘,
36         {
37             firstInitial: function(value) {
38                 return Ext.picker.Date.prototype.getDayInitial(value);
39             },
40             isEndOfWeek: function(value) {
41                 // convert from 1 based index to 0 based
42                 // by decrementing value once.
43                 value--;
44                 var end = value % 7 === 0 && value !== 0;
45                 return end ? ‘</tr><tr role="row">‘ : ‘‘;
46             },
47             renderTodayBtn: function(values, out) {
48                 Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(), out);
49             },
50             renderMonthBtn: function(values, out) {
51                 Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(), out);
52             }
53         }
54     ]
55  });

其中renderTpl部分与后面按钮渲染部分出自源码。

效果:



第二步:在原布局中添加3个spinner组件用来选取时、分、秒,添加一个确认按钮,并在组件渲染之前,将自定义添加的时、分、秒和确认按钮进行初始化

  1 Ext.define(‘My.picker.DateTime‘, {
  2     extend: ‘Ext.picker.Date‘,
  3     alias: ‘widget.datetimepicker‘,
  4     okText:‘确定‘,
  5     okTip:‘确定‘,
  6
  7     renderTpl: [
  8         ‘<div id="{id}-innerEl" data-ref="innerEl" role="grid">‘,
  9             ‘<div role="presentation" class="{baseCls}-header">‘,
 10                 ‘<a id="{id}-prevEl" data-ref="prevEl" class="{baseCls}-prev {baseCls}-arrow" role="button" title="{prevText}" hidefocus="on" ></a>‘,
 11                 ‘<div id="{id}-middleBtnEl" data-ref="middleBtnEl" class="{baseCls}-month">{%this.renderMonthBtn(values, out)%}</div>‘,
 12                 ‘<a id="{id}-nextEl" data-ref="nextEl" class="{baseCls}-next {baseCls}-arrow" role="button" title="{nextText}" hidefocus="on" ></a>‘,
 13             ‘</div>‘,
 14             ‘<table id="{id}-eventEl" data-ref="eventEl" class="{baseCls}-inner" cellspacing="0" role="grid">‘,
 15                 ‘<thead role="presentation"><tr role="row">‘,
 16                     ‘<tpl for="dayNames">‘,
 17                         ‘<th role="columnheader" class="{parent.baseCls}-column-header" title="{.}">‘,
 18                             ‘<div class="{parent.baseCls}-column-header-inner">{.:this.firstInitial}</div>‘,
 19                         ‘</th>‘,
 20                     ‘</tpl>‘,
 21                 ‘</tr></thead>‘,
 22                 ‘<tbody role="presentation"><tr role="row">‘,
 23                     ‘<tpl for="days">‘,
 24                         ‘{#:this.isEndOfWeek}‘,
 25                         ‘<td role="gridcell" id="{[Ext.id()]}">‘,
 26                             // The ‘#‘ is needed for keyboard navigation
 27                             ‘<a href="#" role="button" hidefocus="on" class="{parent.baseCls}-date"></a>‘,
 28                         ‘</td>‘,
 29                     ‘</tpl>‘,
 30                 ‘</tr></tbody>‘,
 31
 32             ‘<table id="{id}-timeEl" style="table-layout:auto;width:auto;margin:0 3px;" class="x-datepicker-inner" cellspacing="0">‘,
 33                 ‘<tbody><tr>‘,
 34                     ‘<td>{%this.renderHourBtn(values,out)%}</td>‘,
 35                     ‘<td>{%this.renderMinuteBtn(values,out)%}</td>‘,
 36                     ‘<td>{%this.renderSecondBtn(values,out)%}</td>‘,
 37                 ‘</tr></tbody>‘,
 38             ‘</table>‘,
 39
 40             ‘<tpl if="showToday">‘,
 41                 ‘<div id="{id}-footerEl" role="presentation" class="{baseCls}-footer">{%this.renderOkBtn(values, out)%}{%this.renderTodayBtn(values, out)%}</div>‘,
 42             ‘</tpl>‘,
 43         ‘</div>‘,
 44         {
 45             firstInitial: function(value) {
 46                 return Ext.picker.Date.prototype.getDayInitial(value);
 47             },
 48             isEndOfWeek: function(value) {
 49                 // convert from 1 based index to 0 based
 50                 // by decrementing value once.
 51                 value--;
 52                 var end = value % 7 === 0 && value !== 0;
 53                 return end ? ‘</tr><tr role="row">‘ : ‘‘;
 54             },
 55             renderTodayBtn: function(values, out) {
 56                 Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(), out);
 57             },
 58             renderMonthBtn: function(values, out) {
 59                 Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(), out);
 60             },
 61             renderHourBtn: function(values, out) {
 62                 Ext.DomHelper.generateMarkup(values.$comp.hourBtn.getRenderTree(), out);
 63             },
 64             renderMinuteBtn: function(values, out) {
 65                 Ext.DomHelper.generateMarkup(values.$comp.minuteBtn.getRenderTree(), out);
 66             },
 67             renderSecondBtn: function(values, out) {
 68                 Ext.DomHelper.generateMarkup(values.$comp.secondBtn.getRenderTree(), out);
 69             },
 70             renderOkBtn: function(values, out) {
 71                 Ext.DomHelper.generateMarkup(values.$comp.okBtn.getRenderTree(), out);
 72             }
 73         }
 74     ],
 75     beforeRender: function () {
 76         var me = this,_$Number=Ext.form.field.Number;
 77         me.hourBtn=new _$Number({
 78             minValue:0,
 79             maxValue:23,
 80             step:1,
 81             width:55
 82         });
 83         me.minuteBtn=new _$Number({
 84             minValue:0,
 85             maxValue:59,
 86             step:1,
 87             width:70,
 88             labelWidth:10,
 89             fieldLabel:‘&nbsp;‘
 90         });
 91         me.secondBtn=new _$Number({
 92             minValue:0,
 93             maxValue:59,
 94             step:1,
 95             width:70,
 96             labelWidth:10,
 97             fieldLabel:‘&nbsp;‘
 98         });
 99
100         me.okBtn = new Ext.button.Button({
101             ownerCt: me,
102             ownerLayout: me.getComponentLayout(),
103             text: me.okText,
104             tooltip: me.okTip,
105             tooltipType:‘title‘,
106             handler:me.okHandler,
107             scope: me
108         });
109         me.callParent();
110     }
111  });

效果:



第三步:添加按钮事件绑定,各种内部逻辑的处理,获取选定的时间等等

时间: 2024-12-31 14:07:50

【ExtJS】自定义组件datetimefield(一)的相关文章

extjs自定义组件类

在使用extjs开发应用系统时,难免会出现一个js文件内包含数百行甚至上千行代码的情况,例如程序主界面或者复杂一点的界面,下面介绍如何通过自定义组件减少单个extjs javascript代码行数的方法. 下图中的主界面显示了两个统计图: 最初的时候统计图的js代码是写死在tagpanel里面的,通过extjs 自定义组件的方法拆分成单独的类文件以后的代码: Ext.define('app.view.main.Main_Pie_Chart', { extend: 'Ext.panel.Panel

【ExtJS】关于自定义组件(一)

一.目的: ExtJS中提供了下拉日期选择控件Ext.form.field.Date与下拉时间选择控件Ext.form.field.Time.不过没有一个在选择日期时选择时间的控件datetimefield.目的就是运用自定义组件的方法,来扩展下拉日期选择控件Ext.form.field.Date,在下拉框中添加时间选择的组件.目标效果: 二.一些知识的梳理: 当自定义创建一个新类时,最好根据需要继承一个功能相近的基类,这是因为Ext JS 提供的自动化生命周期管理将会被合适的布局管理器管理并且

ExtJS(3)- 自定义组件(星级评分)

今天介绍ExtJS的组件开发,这里以星级评分为示例,首先来看看效果图: 然后是功能操作:鼠标移动到五个星星上面时,会有tooltip显示当前的分值.如图:鼠标悬停在第四颗星星时前四颗星星显示高亮笑脸,当点击下去时锁定笑脸并且设定份数为4. 然后我们来说一下实现原理,Ext的组件基本单元是Ext.Component,所以自定义组件可以继承Component,然后显示部分直接用html来显示,包括css和动态事件都可以直接在html上编辑添加. 接下来我们来看代码: Ext.define('Pact

ExtJS 4 组件详解

ExtJS 4 的应用界面是由很多小部件组合而成的,这些小部件被称作"组件(Component)",所有组件都是Ext.Component的子类,Ext.Component提供了生命周期管理包括初始化.渲染.大小和尺寸管理.销毁等功能,这使得所有Ext.Component的子类都自动分享了这些能力.ExtJS提供了各式各样丰富的组件,每一个组件都很容易被扩展创建成自定义组件. The Component Hierarchy 组件层级 容器(Container)是个可以容纳其他组件的特殊

ExtJS关于组件Component生命周期

extjs组件生命周期大体分为3个阶段:初始化.渲染.销毁. 第一阶段:初始化 初始化工作开始于组件的诞生,所有必须的配置设定.事件注册.预渲染处理等都在此时进行. 1.应用组件的配置: 当初始化一个组件的实例时,传递的组件配置对象包含了希望让组件拥有的所有功能,这些都是在Ext.Component基类的前几行代码完成的. 2.注册事件: 诸如enable/disable,show,hide,render,destory,state restore,state save等等事件,是所有继承于Ex

[ExtJS学习笔记]第七节 Extjs的组件components及其模板事件方法学习

本文地址:http://blog.csdn.net/sushengmiyan/article/details/38487519 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源  Sencha Cmd官方网站: http://ww

Vue1.0学习总结(4)———Vue1.0自定义组件、Vue1.0组件之间的通信

Vue自定义组件: 组件:就是一个大的对象:new Vue({})就是一个组件定义一个组件:1.全局组件: <div id="box"> <aaa></aaa> </div> var Aaa=Vue.extend({ template:'<h3>我是一个标题</h3>' }); Vue.component('aaa',Aaa); a)给自定义的组件添加数据: data必须是函数的形式,函数必须返回一个对象(json

1、开发自定义组件简要

一.自定义组件分类 Customized Component:继承VIew ,增加更多的属性和事件.  横向扩展 Compound Component: 继承ViewGroup , 把多个简单控件通过布局拼装一个复合控件.横向扩展 二.定义组件步骤 1 选择继承类(肯定是View or View的子类). 2 类的初始化:新增属性    属性的初值设定. 3 重载方法: 布局及呈现onDraw() , onMeasure() 事件(自定义事件)onKeyEvent() ...  监听器/重载函数

Vue结合原生js实现自定义组件自动生成

就目前三大前端主流数据驱动框架(vue,ng,react)而言,均具有创建自定义组件的api,但都是必须先做到事先写好挂载点,这个挂载点可以是原有静态元素标签也可以是自定义模板:对于多种组件通过同一数据流生成的,如果事先在页面上写好挂载点(mounted),然后通过dom操作去动态添加,会遇到类似这样一条错误提示信息:Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.(…).这又是为何呢,下一