用extjs,一个很重要的原因是因为他的grid真的很好,很强大,要使用它的grid,不可避免会用到PagingToolbar这个widget,不过使用后发现,这个paging的工具栏有几个缺点:
1.通过键盘快捷键翻页,方式与我们习惯不太一样,看看PagingToolbar源代码:
而我希望使用pageup或方向←翻到前一页,使用pagedown或方向→翻到后一页,使用home或方向↑翻到第一页,使用end或↓翻到最后一页
2.页码选择的textfield未进行格式控制,源代码中使用的是一个dom,因此也没有ext中textfield控件的样式去美化,可以使用任何字符去输入。
3.缺少自定义pageSize的输入框
4.和grid配合时,grid第一次load的时候必须要提供start和limit两个参数,比较麻烦,而且传递给后台的参数start和limit不方便后台使用,一般后台翻页的对象经过封装,使用pageNo和pageSize属性的较多,因此要改造pagingtoolbar的传输方式
下面是经过扩展的DynamicPageBar的代码:
此扩展修改了翻页的逻辑,传递给后台的参数,以及新增加了几个事件和方法用来更灵活的控制翻页逻辑,增加了自定义每页显示数量,和Grid配合时无需指定start和limit参数,传递给后台的参数为pageNo与pageSize,排序也没有什么问题,如图:
调用的代码:
1.通过键盘快捷键翻页,方式与我们习惯不太一样,看看PagingToolbar源代码:
onPagingKeydown : function(e){ var k = e.getKey(), d = this.getPageData(), pageNum; if (k == e.RETURN) { e.stopEvent(); pageNum = this.readPage(d); if(pageNum !== false){ pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; this.doLoad(pageNum * this.pageSize); } }else if (k == e.HOME || k == e.END){//第一页和最后一页 e.stopEvent(); pageNum = k == e.HOME ? 1 : d.pages; this.field.dom.value = pageNum; }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){//前一页和后一页 e.stopEvent(); if(pageNum = this.readPage(d)){ var increment = e.shiftKey ? 10 : 1; if(k == e.DOWN || k == e.PAGEDOWN){ increment *= -1; } pageNum += increment; if(pageNum >= 1 & pageNum <= d.pages){ this.field.dom.value = pageNum; } } } }
而我希望使用pageup或方向←翻到前一页,使用pagedown或方向→翻到后一页,使用home或方向↑翻到第一页,使用end或↓翻到最后一页
2.页码选择的textfield未进行格式控制,源代码中使用的是一个dom,因此也没有ext中textfield控件的样式去美化,可以使用任何字符去输入。
3.缺少自定义pageSize的输入框
4.和grid配合时,grid第一次load的时候必须要提供start和limit两个参数,比较麻烦,而且传递给后台的参数start和limit不方便后台使用,一般后台翻页的对象经过封装,使用pageNo和pageSize属性的较多,因此要改造pagingtoolbar的传输方式
下面是经过扩展的DynamicPageBar的代码:
Ext.ns("Ext.ux.grid"); Ext.ux.grid.DynamicPageBar=Ext.extend(Ext.Toolbar,{ pageSize:20, pageNo:1, totalCount:0, displayMsg:'Displaying {0} - {1} of {2}', emptyMsg : 'No data to display', beforePageText : "page", afterPageText : "of {0}", beforeChooseText: "show", afterChooseText: "items", firstText : "First Page", prevText : "Previous Page", nextText : "Next Page", lastText : "Last Page", refreshText : "Refresh", initComponent:function(){ this.addEvents("toFirst","toPre","toNext","toLast","toPage","Refresh","change"); Ext.ux.grid.DynamicPageBar.superclass.initComponent.call(this); this.bind(this.store); }, onRender:function(ct,position){ Ext.ux.grid.DynamicPageBar.superclass.onRender.call(this, ct, position); this.first = this.addButton({ tooltip: this.firstText, iconCls: "x-tbar-page-first", disabled: true, handler: this.onClick.createDelegate(this, ["first"]) }); this.prev = this.addButton({ tooltip: this.prevText, iconCls: "x-tbar-page-prev", disabled: true, handler: this.onClick.createDelegate(this, ["pre"]) }); this.addSeparator(); this.add(this.beforePageText); this.field=this.addField(new Ext.form.NumberField({ id:"pageNoField", value:1, allowDecimals:false, allowNegative:false, minValue:1, target:this.onPagingKeydown, scopeTarget:this, width:30, enableKeyEvents:true, listeners:{ "focus":function(obj){ obj.selectText(); }, "keydown":function(obj,e){ eval(obj.target(obj,e,obj.scopeTarget)); } } })); this.afterTextEl = this.addText(String.format(this.afterPageText, 1)); this.addSeparator(); this.next = this.addButton({ tooltip: this.nextText, iconCls: "x-tbar-page-next", disabled: true, handler: this.onClick.createDelegate(this, ["next"]) }); this.last = this.addButton({ tooltip: this.lastText, iconCls: "x-tbar-page-last", disabled: true, handler: this.onClick.createDelegate(this, ["last"]) }); this.addSeparator(); this.loading = this.addButton({ tooltip: this.refreshText, iconCls: "x-tbar-loading", handler: this.onClick.createDelegate(this, ["refresh"]) }); this.addSeparator(); this.add(this.beforeChooseText); this.choose=this.addField( new Ext.form.NumberField({ id:"pageChooseField", width:30, allowDecimals:false, allowNegative:false, minValue:1, target:this.onChooseKeydown, scopeTarget:this, enableKeyEvents:true, listeners:{ "focus":function(obj){ obj.selectText(); }, "keydown":function(obj,e){ eval(obj.target(obj,e,obj.scopeTarget)); } } }) ); this.add(this.afterChooseText); this.addSeparator(); if(this.displayInfo){ this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'}); }; this.loadParams={pageNo:this.pageNo,pageSize:this.pageSize}; Ext.getCmp("pageChooseField").setValue(this.loadParams.pageSize); this.store.baseParams=this.loadParams; }, onClick : function(which){ var store = this.store; switch(which){ case "first": this.loadParams.pageNo=1; this.fireEvent('toFirst', this, this.getPageData()); break; case "pre": this.loadParams.pageNo--; this.fireEvent('toPre', this, this.getPageData()); break; case "next": this.loadParams.pageNo++; this.fireEvent('toNext', this, this.getPageData()); break; case "last": var total = store.getTotalCount(); this.loadParams.pageNo=Math.ceil(total/this.loadParams.pageSize); this.fireEvent('toLast', this, this.getPageData()); break; case "refresh": this.fireEvent('refresh', this, this.getPageData()); break; }; this.doLoad(); }, bind:function(store){ store = Ext.StoreMgr.lookup(store); store.on("beforeload", this.beforeLoad, this); store.on("load", this.onLoad, this); store.on("loadexception", this.onLoadError, this); this.store = store; }, beforeLoad:function(){ if(this.rendered && this.loading){ this.store.recordIndex=this.getCursor()+1; this.loading.disable(); } }, onLoad : function(store, r, o){ if(!this.rendered){ return; } var d=this.getPageData(); this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pageNum); Ext.getCmp("pageNoField").setValue(d.pageNo); this.first.setDisabled(d.pageNo == 1); this.prev.setDisabled(d.pageNo == 1); this.next.setDisabled(d.pageNo == d.pageNum); this.last.setDisabled(d.pageNo == d.pageNum); this.loading.enable(); this.updateInfo(); this.fireEvent('change', this, this.getPageData()); this.ownerCt.view.updateHeaderSortState(); }, doLoad : function(){ var params=this.getPageData(); this.store.baseParams=params; this.store.load(); }, onLoadError:function(){ if(!this.rendered){ return; } this.loading.enable(); }, getPageData:function(){ var total = this.store.getTotalCount(); var pageData=this.loadParams; pageData.pageNum=Math.ceil(total/pageData.pageSize); return pageData; }, updateInfo : function(){ if(this.displayEl){ var count = this.store.getCount(); var d = this.getPageData(); var preCount = (d.pageNo-1)*d.pageSize; var msg = count == 0 ? this.emptyMsg : String.format( this.displayMsg, preCount+1, preCount+count, this.store.getTotalCount() ); this.displayEl.update(msg); } }, onPagingKeydown : function(obj,e,scope){ var k=e.getKey(); var currentNo=obj.getValue(); var params=scope.loadParams; if(k == e.ENTER){ e.stopEvent(); if(params.pageNo != currentNo){ if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; }else{ params.pageNo=currentNo; } }else{ return; } }else if (k == e.HOME || k == e.UP){ e.stopEvent(); if(currentNo<1||currentNo>params.pageNum){ obj.setValue(scope.loadParams.pageNo); return; } if(params.pageNo==1)return; params.pageNo = 1; }else if (k == e.LEFT || k == e.PAGE_UP){ if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; } e.stopEvent(); if(params.pageNo==1)return; params.pageNo=Math.max(1,params.pageNo-1); }else if (k == e.RIGHT || k == e.PAGE_DOWN){ e.stopEvent(); if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; } if(params.pageNo==params.pageNum)return; params.pageNo=Math.min(params.pageNum,params.pageNo+1); }else if (k == e.END || k == e.DOWN){ e.stopEvent(); if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; } if(params.pageNo==params.pageNum)return; params.pageNo = params.pageNum; }else{ return; } scope.doLoad(); }, onChooseKeydown:function(obj,e,scope){ var k=e.getKey(); var currentNo=obj.getValue(); var params=scope.loadParams; if(k==e.ENTER){ if(currentNo<1||currentNo==params.pageSize){ obj.setValue(params.pageSize); return ; }else{ params.pageSize=currentNo; params.pageNo=1; scope.doLoad(); } }else{ return; } }, isLastPage:function(){ var d=this.getPageData(); return d.pageNo==d.pageNum; }, isFirstPage:function(){ var d=this.getPageData(); return d.pageNo==1; }, toFirstPage:function(){ if(!this.isFirstPage()){ this.onClick("first"); } }, toLastPage:function(){ if(!this.isLastPage()){ this.onClick("last"); } }, toPrePage:function(){ if(!this.isFirstPage()){ this.onClick("pre"); } }, toNextPage:function(){ if(!this.isLastPage()){ this.onClick("next"); } }, refresh:function(){ this.onClick("refresh"); }, getCursor:function(){ var d=this.getPageData(); return (d.pageNo-1)*d.pageSize; } }); Ext.reg("dpagebar",Ext.ux.grid.DynamicPageBar);
此扩展修改了翻页的逻辑,传递给后台的参数,以及新增加了几个事件和方法用来更灵活的控制翻页逻辑,增加了自定义每页显示数量,和Grid配合时无需指定start和limit参数,传递给后台的参数为pageNo与pageSize,排序也没有什么问题,如图:
调用的代码:
var mainStore=new Ext.data.Store({ autoLoad:true, url:sys.Constants.ROOTPATH+"/sysmgr/SysUser_page.do", remoteSort:true, sortInfo:{ field:"createDate", direction:"DESC" }, reader:mainReader}); var mainPageBar=new Ext.ux.grid.DynamicPageBar({ pageSize:15, store:mainStore, displayInfo:true, emptyMsg:"没有查询到相关的记录"}); var mainGrid=new Ext.grid.GridPanel({ renderTo:Ext.getBody(), width:1200, height:420, frame:true, stripeRows:true, loadMask:true, viewConfig:{ forceFit:true }, selModel:sm, colModel:cm, store:mainStore, bbar:mainPageBar });
相关推荐
这个"EXTJS扩展例子集"显然是一个包含EXTJS3.0相关扩展组件的资源包,旨在帮助开发者理解和学习如何使用这些扩展。 在EXTJS中,扩展(Extensions)通常是指对框架原有功能的增强或定制,它们可以是新的组件、小部件...
本压缩包文件中收集了基于ExtJs扩展的一些控件,这些控件能够进一步增强应用程序的功能和用户体验。 首先,我们来看看“ExtJs:收集基于ExtJs扩展的一些控件”。这个文件可能是对一些自定义或第三方开发的ExtJs控件...
extjs扩展教程 extjs扩展教程extjs扩展教程
在标题和描述中提到的“ExtJs DWR扩展”是指将这两者结合使用,以增强数据交换和UI更新的能力。 1. **DWRProxy**: DWRProxy是ExtJs中的一个类,它作为DWR和ExtJs之间的桥梁,使得ExtJs可以利用DWR的远程调用功能。...
ExtJS扩展包(ExtJsExtenderControl)是针对ExtJS框架的一个增强工具,它扩展了ExtJS的功能,特别是在与.NET框架结合使用时,为开发者提供了更丰富的控件和功能。ExtJS是一个流行的JavaScript库,用于构建富客户端...
本文是extjs的扩展包,可以在页面中插入图片,把这个js文件放入相应的目录下,extjs就是引用这个类型,就可以插入图片
"Extjs树分页组件扩展"就是为了解决这一问题而设计的,它通过扩展TreeLoader和PagingToolbar,实现了在树形组件中进行分页加载的效果。 **TreeLoader的扩展** TreeLoader是ExtJS中负责异步加载树节点的类。在原生...
EXTTLD(EXTJS Tag Library Descriptors)则是EXTJS扩展标记的元数据,它定义了这些自定义标签的行为和属性。 以下是对EXTJS扩展标记中涉及的一些主要知识点的详细解释: 1. **EXTJS组件**:EXTJS的核心是它的组件...
dreamweaver Extjs 扩展插件语法提示 在dreamweaver中可以显示Extjs语法提示,提升开发效率,用起来很方便 分.zxp和.mxp两种扩展 cc2015,cs6均可用。 扩展安装需要到用Adobe Extension Manager,请自行在网上百度,...
同事写的extjs月份扩展控件,可以直接调用,用于只要求显示月份不显示日期的项目
然而,有时开发人员可能需要对这些控件进行自定义,以满足特定业务需求,比如在本例中,我们需要扩展EXTJS的时间控件以实现“年度”选择的功能。 EXTJS的Date Picker默认提供了日、月、年的选择,但可能并不完全...
### ExtJS 组件扩展知识点详解 #### 一、ExtJS组件扩展概述 ExtJS是一款基于JavaScript的开源前端框架,主要用于构建复杂的企业级Web应用程序。它提供了丰富的UI组件库,可以帮助开发者快速构建美观且功能强大的...
本文将深入探讨“Extjs扩展DateTimeField时间初始化及点击日期显示Bug”这一主题,帮助开发者解决实际开发中遇到的难题。 DateTimeField是EXTJS中用于处理日期和时间选择的组件,它允许用户同时选择日期和时间,...
Grid提供了丰富的功能,包括分页、排序、过滤、编辑等,是ExtJS库中的核心组件之一。"Extjs Grid 扩展实例"是一个演示如何增强Grid功能的实践案例,通过这个实例,我们可以学习到如何在原有Grid的基础上进行自定义...
Extjs表单VTYPE扩展,方便验证!
在“ExtJS扩展:垂直页签tabPanel”这个主题中,我们将探讨如何在ExtJS中实现一个创新的垂直布局的页签(tab)组件,这在很多情况下可以提供更好的用户界面体验。 首先,我们看到有两个JavaScript文件,TabPanel.js...
在给定的“Extjs4 combogrid扩展”中,我们主要关注的是如何将传统的下拉框(combo)扩展为同时支持网格(grid)显示的功能。 标题中的“Extjs4 combogrid扩展”意味着我们要在ExtJS 4框架内,改造原有的 Combo ...
总结起来,"extjs多选 下拉框扩展"是为了满足ExtJS应用中多选功能的需求,通过对原生ComboBox组件进行扩展和定制,实现了带有复选框的多选下拉框。这个扩展可能包括了新的配置项、模板修改、事件处理、数据模型、...
这个“ExtJs中datetimefield扩展”可能包含了一个完整的实现,无需其他依赖,可以直接运行并查看效果。 首先,我们要理解ExtJs的基础。ExtJs是一个JavaScript库,主要用于构建富客户端的Web应用。它提供了一套完整...
在本文中,我们将深入探讨如何在ExtJS中扩展PropertyGrid以实现分组功能,这个问题源自于原生ExtJS PropertyGrid控件不支持属性分组。首先,我们要理解PropertyGrid的基本结构,它主要由以下几个核心部分组成: 1. ...