扩展grid代码
/** * @auther huangfeng * @class Ext.ux.GridExtend * 通用的grid */ Ext.ux.GridExtend=function(config){ Ext.QuickTips.init(); this.config=config; this.filters=this.config.filters||''; /** * @param {String} * 显示列表的id */ this.el=this.config.el||document.body; /** * @param {String} * 读取编辑数据的form的url */ this.editUrl=this.config.editUrl; /** * @param {String} * 读取编辑数据的form的url */ this.deleteUrl=this.config.deleteUrl; /** * @param {String} * 读取列表数据的url */ this.storeUrl=this.config.storeUrl; /** * @param {String} * 保存添加到列表数据的url */ this.formSaveUrl=this.config.formSaveUrl; /** * @param {String} * 列表的标题 */ this.title=this.config.title||''; /** * @param {Array} * 列表顶部状态栏 */ this.tbar=this.config.tbar||[{//grid顶部栏位 text:'添加',//按钮的名称 tooltip:'添加数据',//鼠标停留在按钮上的提示 iconCls:'add',//按钮图表的类 handler:this.newInfo.createDelegate(this)//处理按钮被点击时触发的时间函数 },'-',{//'-'为多按钮间隔符 text:'删除',//删除按钮的名称 tooltip:'删除数据',//鼠标停留在按钮上的提示 iconCls:'remove',//按钮图表的类 handler:this.handlerDelete.createDelegate(this) //处理按钮被点击时触发的时间函数 },'-',{ text:'导出Excel',//导出Excel按钮的名称 tooltip:'导出Excel',//鼠标停留在按钮上的提示 iconCls:'exportExcel', handler:this.exportExcel.createDelegate(this)//处理按钮被点击时触发的时间函数 }]; /** * @param 选择框对象(模型) */ this.sm=this.config.sm||new Ext.grid.CheckboxSelectionModel({ //start Ext.grid.CheckboxSelectionModel singleSelect:false//是否只能选择一个 }); /** * @param {Array} * 列表的栏的前面数据 */ this.cmDataArrayBefore=[ //start Ext.grid.ColumnModel //defaultSortable:true,//默认情况下为排序 new Ext.grid.RowNumberer(),//数据函数序列号 this.sm ]; /** * @param {Array} * 显示的内容是从后台读取出来的数据,所以此数据中的dataIndex属性要与 * 从后台读取的字段要一致 */ this.cmDataArray=this.config.cmDataArray||[]; /** * @param {Array} * 列表的栏的后面数据 */ this.cmDataArrayAfter=this.config.cmDataArrayAfter||[]; /** * @param {Ext.grid.ColumnModel} * 列表的栏位数据 */ this.cm=this.config.cm||new Ext.grid.ColumnModel( this.cmDataArrayBefore.concat(this.cmDataArray).concat(this.cmDataArrayAfter) );//end Ext.grid.ColumnModel /** * @param {Array} * 读取gridStore数据的字段设置数据对象 */ this.gridStoreFields=this.config.gridStoreFields||new Array(); /* * 如果this.gridStoreFields中没有数据,把this.cmDataArray中的dataIndex的属性值 * 赋予gridStoreFields数组中对象的name属性值 */ if(this.gridStoreFields.length==0){ for(var i=0,len=this.cmDataArray.length;i<len;i++){ this.gridStoreFields[i]={name:this.cmDataArray[i].dataIndex}; } } /** * @param {new Ext.data.Store} * 从后台读取的列表内容 */ this.gridStore=this.config.gridStore||new Ext.data.Store({ //start Ext.data.Store proxy:new Ext.data.HttpProxy({ url:this.storeUrl//读取数据的url }), reader:new Ext.data.JsonReader({//start Ext.data.JsonReader root:'rows', //存储数据的属性 totalProperty:'results',//总共的页数 id:'uniqueCode'//每行的id值 },//end Ext.data.JsonReader this.gridStoreFields) });//end Ext.data.Store this.gridStore.load({params:{start: 0, limit: 10}}); /** * @param {Ext.PagingToolbar} * 底部状态栏 */ this.bbar=this.config.bbar||new Ext.PagingToolbar({//在grid底层添加分页工具栏 pageSize:10,//显示的数据条数 store:this.gridStore,//选择翻页按钮时的加载到grid的数据 displayInfo:true,//设置是否显示分页栏的信息 displayMsg:'显示第 {0} 条到 {1} 条记录,一共 {2} 条', //消息栏的页数信息 emptyMsg:"没有记录"//当没有记录时要显示的信息 });//end bbar /** * 如果要设置此参数必须在cm中设置相应的id */ this.autoExpandColumn=this.config.autoExpandColumn||''; /** @param {Object} * 默认情况下有此显现,如果不需要可以为false * 必须含有下列参数: * loadingEL {String} 加载页面时显示的内容id * loadingMaskEl {String} 渐显的内容id */ this.loadingMark=this.config.loadingMark||{ loadingEL:'loading', loadingMaskEL:'loading-mask' }; /** * @param {Ext.grid.GridPanel} * @private */ this.grid=this.config.gridStore||new Ext.grid.GridPanel({ //el:this.el, //显示grid对象的层ID. store:this.gridStore,// grid装载的数据. viewConfig:{ autoFill:true, deferEmptyText:'请等待...', emptyText:'没有数据', enableRowBody:true }, sm:this.sm,//在每行数据前添加的一组checkBox height:Ext.get(this.el).getComputedHeight(), //autoHeight:true, loadMask:true, maskDisabled:true, cm:this.cm, //设置栏位. title:this.title,//标题名称. iconCls:'icon-grid',//标题前的图片css类 autoExpandColumn:this.autoExpandColumn, plugins: this.filters, bbar:this.bbar, tbar:this.tbar }); this.formFields=this.config.formFields||new Array(); /** * 双击数据的事件,弹出一个编辑此条数据的层 * @param grid 此列表的对象 * @param rowIndex 在列表中的行数 * @param e 触发此事件的事件对象 */ this.rowdblclick=this.config.rowdblclick||function(grid, rowIndex, e){ var selectId=this.gridStore.data.items[rowIndex].id; this.editInfo(selectId); }; this.grid.on('rowdblclick',this.rowdblclick.createDelegate(this)); this.grid.render(this.el); //当js加载完毕后删除loading页面并渐显内容 if(this.loadingMark){ setTimeout(function(){ Ext.get(this.loadingMark.loadingEL).remove(); Ext.get(this.loadingMark.loadingMaskEL).fadeOut({remove:true}); }.createDelegate(this), 250); } } Ext.ux.GridExtend.prototype={ /** * 加载 form表单的数据 * @param selectId 选择此条数据的唯一标识码,此参数发送到后台处理 */ editInfo:function(selectId){ var form=this.getForm(); form.form.load({//start load 参数设置 url:this.editUrl, params:{ uniqueCode:selectId }, waitMsg:'Loading..' });//end load 参数设置 this.formWindow(form,'编辑'); }, getForm:function(){ //错误信息放在右边 Ext.form.Field.prototype.msgTarget = 'side'; //var formSaveUrl=this.formSaveUrl; //var formFields=this.formFields; var formSaveUrl=Ext.clone(this.formSaveUrl); var formFields=Ext.clone(this.formFields); //实例化form面板 var form=new Ext.form.FormPanel({//start Ext.form.FormPanel baseCls:'x-plain', url:this.formSaveUrl, frame:true, id:'form', items:formFields });//end Ext.form.FormPanel return form; }, /** * 装form表单的窗口 * @param form 要装载的form @param titlePre 标题的前缀 */ formWindow:function(form,titlePre){ //实例化窗口 this.window=new Ext.Window({//start Ext.Window title:titlePre+'任务列表', width:500, height:500, minWidth:300, minHeight:300, layout:'fit', //closeAction:'hide', plain:true, bodyStyle:'padding:5px', iconCls:'form', buttonAlign:'center', items:form, modal:true, buttons:[{//按钮 text:'保存', handler:(function(){//start function按钮处理函数 if(form.getForm().isValid()){ //表单是否通过交验,通过责提交表单,否则弹出错误窗口 form.getForm().submit({ scope:this, waitMsg:'保存数据...', success:function(form,action){ Ext.MessageBox.alert('消息:','保存成功'); this.grid.store.reload(); this.window.close() ; }, failure:function(form,action){ Ext.MessageBox.alert('有错误:', action.result.errors); this.window.close() ; } }); }else{ Ext.MessageBox.alert('有错误:','表单填写由错误!'); } }).createDelegate(this)//end function },{ text:'重置', handler:function(){//start function按钮处理函数 form.getForm().reset(); }//end function }] });//end Ext.Window //显示窗口 this.window.show(); }, /** * 添加列表新数据的函数 */ newInfo:function(){//start newTableInfo this.formWindow(this.getForm(),'添加'); },//end newTableInfo /** * 删除数据,并把此数据的唯一标识码发送到后台 */ handlerDelete:function(){//start deleteRecord this.sendId(this.deleteUrl); },//end deleteRecord sendId:function(url){//start deleteRecord var ids=new Array(); //存放uniqueCode的数组 var records=this.grid.selModel.selections.items; //grid中被选择的数据,类型为Array for(var i = 0, len = records.length; i < len; i++){ ids[ids.length]=records[i].id; //把数据id赋予ids数组中 } Ext.Ajax.request({//调用Ajax发送请求到后台 scope:this, url:url,//删除grid数据的url. success:function(transport){//处理成功后返回的函数 var oXmlDom=transport.responseText; if(oXmlDom!=''){ var content=eval(oXmlDom); Ext.MessageBox.alert("有错误:",content.errors) }else{ this.grid.store.reload();//重新加载grid中的数据 } }, failure:function(){//处理后台删除失败的函数 Ext.MessageBox.alert('消息','删除失败!'); } }); },//end deleteRecord exportExcel:function(){ document.location.href=url; //'http://localhost:8080/chalk/hf/sortManager.do?action=export'; } } 下面是使用前要再加的js,主要是处理一些ext2.0一些效果,不加也可以,不过可能会少些效果 //填充图片的本地应用 Ext.BLANK_IMAGE_URL='../resources/images/default/s.gif'; //在ie中默认的宽度不够 Ext.apply(Ext.MessageBox,{ alert:function(title, msg, fn, scope){ this.show({ title : title, msg : msg, buttons: this.OK, minWidth:200, fn: fn, scope : scope }); return this; } }); Ext.menu.RangeMenu.prototype.icons = { gt: '../resources/extendIamges/greater_then.png', lt: '../resources/extendIamges/less_then.png', eq: '../resources/extendIamges/equals.png' }; Ext.grid.filter.StringFilter.prototype.icon =图片路径 //'../resources/extendIamges/find.png'; /* * 修改filter发送到后台的数据模式. * 例:filter.[i][field]、filter.[i][type]、filter.[i][value]、 filter.[i][comparison]、 * */ Ext.grid.GridFilters.prototype.buildQuery=function(filters){ var p = {}; for(var i=0, len=filters.length; i<len; i++) { var f = filters[i]; var root = [this.paramPrefix, '[', i, ']'].join(''); p[root + '[field]'] = f.field; //修改此处 var dataPrefix = root; for(var key in f.data) { p[[dataPrefix, '[', key, ']'].join('')] = f.data[key]; } } return p; } //添加时间交验函数 Ext.apply(Ext.form.VTypes, { //时间交验属性 daterange: function(val, field) { var date = field.parseDate(val); var dispUpd = function(picker) { var ad = picker.activeDate; picker.activeDate = null; picker.update(ad); }; //debugger; if (field.startDateField) { var sd = field.startDateField; sd.maxValue = date; if (sd.menu && sd.menu.picker) { sd.menu.picker.maxDate = date; dispUpd(sd.menu.picker); } } else if (field.endDateField) { var ed = field.endDateField; ed.minValue = date; if (ed.menu && ed.menu.picker) { ed.menu.picker.minDate = date; dispUpd(ed.menu.picker); } } return true; } }); Ext.QuickTips.init(); 此代码中可能会用到之前的radio和checkbox校代码 这里也随便贴出来 /** * 此js为补充Extjs的chechbox和radio校验 * * checkbox需要添加属性: * showInvalidText:Boolean * 此属性为标识出在那个checkbox后面添加错误图片 * 注意:boxLabel需要两个字符不然图片会合字重叠,可以在字符后加一空格' ' * * radio需要添加属性: * showInvalidText:Boolean * 此属性为标识出在那个radio后面添加错误图片 */ Ext.apply(Ext.form.Checkbox.prototype, { getErrorCt:function(){ return this.el.findParent('.x-form-element', 5, true) || // use form element wrap if available this.el.findParent('.x-form-field-wrap', 5, true); // else direct field wrap } }); Ext.apply(Ext.form.Radio.prototype, { getErrorCt:function(){ return this.el.findParent('.x-form-element', 5, true) || // use form element wrap if available this.el.findParent('.x-form-field-wrap', 5, true); // else direct field wrap } }); function markInvalid(msg){ if (!this.rendered || this.preventMark) { // not rendered return; } this.el.addClass(this.invalidClass); msg = msg || this.invalidText; switch (this.msgTarget) { case 'qtip' : this.el.dom.qtip = msg; this.el.dom.qclass = 'x-form-invalid-tip'; if (Ext.QuickTips) { // fix for floating editors interacting with // DND Ext.QuickTips.enable(); } break; case 'title' : this.el.dom.title = msg; break; case 'under' : if (!this.errorEl) { var elp = this.getErrorCt(); this.errorEl = elp.createChild( { cls : 'x-form-invalid-msg' }); this.errorEl.setWidth(elp.getWidth(true) - 20); } this.errorEl.update(msg); Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this); break; case 'side' : if (!this.showInvalidText) { break; } if (!this.errorIcon) { var elp = this.getErrorCt(); this.errorIcon = elp.createChild( { cls : 'x-form-invalid-icon' }); } this.errorIcon.alignTo(this.el.next(), 'tl-tr', [2, 0]); this.errorIcon.dom.qtip = msg; this.errorIcon.dom.qclass = 'x-form-invalid-tip'; this.errorIcon.show(); this.on('resize', this.alignErrorIcon, this); break; default : var t = Ext.getDom(this.msgTarget); t.innerHTML = msg; t.style.display = this.msgDisplay; break; } this.fireEvent('invalid', this, msg); } function clearInvalid(){ if (!this.rendered || this.preventMark) { // not rendered return; } this.el.removeClass(this.invalidClass); switch (this.msgTarget) { case 'qtip' : this.el.dom.qtip = ''; break; case 'title' : this.el.dom.title = ''; break; case 'under' : if (this.errorEl) { Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this); } break; case 'side' : if (this.errorIcon) { this.errorIcon.dom.qtip = ''; this.errorIcon.hide(); this.un('resize', this.alignErrorIcon, this); } break; default : var t = Ext.getDom(this.msgTarget); t.innerHTML = ''; t.style.display = 'none'; break; } this.fireEvent('valid', this); } function validate(){ var array = this.ownerCt.find('name', this.name); if (this.validateValue(this.processValue(this.getRawValue()))) { for(var i=0;i<array.length;i++){ array[i].clearInvalid(); } return true; } return false; } function validateValue() { if (!this.getGroupValue()) { this.markInvalid(); return false; } return true; } Ext.form.Checkbox.prototype.markInvalid=Ext.form.Radio.prototype.markInvalid = markInvalid; Ext.form.Checkbox.prototype.clearInvalid=Ext.form.Radio.prototype.clearInvalid = clearInvalid; Ext.form.Checkbox.prototype.validate=Ext.form.Radio.prototype.validate = validate; Ext.form.Checkbox.prototype.validateValue=function(){ var array = this.ownerCt.find('name', this.name); for(var i=0;i<array.length;i++){ if(array[i].getValue()){ return true; } } this.markInvalid(); return false; } Ext.form.Radio.prototype.validateValue = validateValue;