最近做一个网站,无意中发现竟然有ExtJS这样美妙的东西
于是后台就用ExtJs来做了,做的时候碰到一个问题
就是GridPanel只能对动态数据进行分页,而之前业务层已经全部写好了,再修改实在不方便
而且网站数据量不大,所以就想能不能先把数据全部获取到本地,然后再对本地数据进行分页
琢磨了好几天,结合网上一些人的方法,初步实现了一套方法,全部代码如下,注释有说明
代码
var Data;//存储获取的数据var DataStore;//数据存储器var Pager;//分页器var PerCount;//每页的数据量var Grid;//GridPanel容器function GetDataFromWebService()//从WebService获取数据{ Ext.Ajax.request( { url:'WebService.asmx/GetData', method:'POST', jsonData: { Parameter1:‘参数值’ } , success:OnGetDataSuccess, failure:OnGetDataFail } );}function OnGetDataSuccess(request,options)//数据获取成功{ Data=Ext.util.JSON.decode(request.responseText); //将获取的Json数据格式化 DataStore.loadData(GetPagerData(Data),false); DataStore.load(); //这个很重要 Pager.doLoad(0); //这个很重要}function OnGetDataFail(request,options)//获取数据失败{ alert('失败了!');}function GetPagerData(InData)//从静态数据中获取每页的数据{ var TempData=//为什么要用'd'作为json数据的根,因为从WebService获取Json数据经查看就是以'd'为根的 { 'd':[] }; if(InData.length>PerCount) { for(var i=0;i<=PerCount-1;i++) { TempData.d.push(InData.d); } } else { for(var i=0;i<=InData.d.length-1;i++) { TempData.d.push(InData.d); } } return TempData;}function SerGrid();{ Data=//获取数据之前的Loading数据 { 'd':[ { '字段1':'数据载入中','字段2':'数据载入中','字段3':'数据载入中','字段4':'数据载入中','字段5':'数据载入中' } ] }; DataStore=new Ext.data.Store( { //数据存储器 proxy:new Ext.data.MemoryProxy(GetPagerData(Data)), reader:new Ext.data.JsonReader( { root:'d' }, [ { name:'字段1' }, { name:'字段2' }, { name:'字段3' }, { name:'字段4' }, { name:'字段5' } ]) }); var ColM=new Ext.grid.ColumnModel(//行定义器 [ { header:"字段显示名1",dataIndex:"字段1",sortable:true }, { header:"字段显示名2",dataIndex:"字段2",sortable:true }, { header:"字段显示名3",dataIndex:"字段3", { header:"字段显示名4",dataIndex:"字段4", { header:"字段显示名5",dataIndex:"字段5",sortable:true } ]); Pager=new Ext.PagingToolbar( { id:'Grid_Pager', pageSize:PerCount, store:DataStore, displayInfo:true, paramNames: { start:'start',limit:'limit',cid:'cid' }, displayMsg:'显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg:'没有数据', updateInfo:function ()//重写UpdateInfo { if(this.displayEl) { var count=this.store.getCount(); var msg=count==0?this.emptyMsg:String.format(this.displayMsg,this.cursor+1,Math.min(this.cursor+this.pageSize-1,Data.d.length-1)+1,Data.d.length); this.displayEl.update(msg); } }, onLoad:function (store,r,o)//重写OnLoad { if(!this.rendered) { this.dsLoaded=[store,o]; return ; } var d=this.getPageData(),ap=d.activePage,ps=d.pages; this.afterTextEl.el.innerHTML=String.format(this.afterPageText,d.pages); this.field.dom.value=ap; this.first.setdisabled(ap==1); this.prev.setdisabled(ap==1); this.next.setdisabled(ap==ps); this.last.setdisabled(ap==ps); this.loading.enable(); this.updateInfo(); }, doLoad:function (start)//重写doLoad { var TempData= { 'd':[] }; var i=0; var len=this.pageSize; for(i=0;i<len;i++) { if(Data.d[start+i]!=null) { TempData.d.push(Data.d[start+i]); } } this.store.loadData(TempData,false); }, getPageData:function ()//重写getPageData { var total=Data.d.length; return { total:total, activePage:Math.ceil((this.cursor+this.pageSize)/this.pageSize), pages:total<this.pageSize?1:Math.ceil(total/this.pageSize) }; }, onClick:function (which)//重写onClick { switch(which) { case "first": this.doLoad(0); break; case "prev": var t=this.cursor; this.cursor=Math.max(0,t-this.pageSize); this.doLoad(Math.max(0,t-this.pageSize)); break; case "next": var t=this.cursor; this.cursor=t+this.pageSize; this.doLoad(t+this.pageSize); break; case "last": var total=Data.d.length; var extra=total%this.pageSize; var lastStart=extra?(total-extra):total-this.pageSize; this.cursor=extra?(total-extra):total-this.pageSize; this.doLoad(lastStart); break; case "refresh": var t=this.cursor; this.cursor=t; this.doLoad(t); break; } } }); Grid=new Ext.grid.GridPanel( { cm:ColM, sm:new Ext.grid.RowSelectionModel( { singleSelect:true }), loadMask: { msg:'正在统计,请稍候.' }, id:'Grid', title:'Grid', autoHeight:true, autoWidth:true, bbar:Pager }); DataStore.load(); //这个很重要,用来显示Loading数据}funtionMain(){ Grid.render(Ext.getBody()); GetDataFromWebService();}
主要的两个步骤就是重写GridPanel和从WebService获取数据 这样就可以实现静态Json数据在GridPanel里的分页了 我的WebService里输出的是一个Linq查询的ToList,Json数据的根为'd',其他的没有测试过 不过相信DataSet等类型只要稍加修改同样有效 (文/ryyd 出处/博客园)
于是后台就用ExtJs来做了,做的时候碰到一个问题
就是GridPanel只能对动态数据进行分页,而之前业务层已经全部写好了,再修改实在不方便
而且网站数据量不大,所以就想能不能先把数据全部获取到本地,然后再对本地数据进行分页
琢磨了好几天,结合网上一些人的方法,初步实现了一套方法,全部代码如下,注释有说明
代码
CODE:
var Data;//存储获取的数据var DataStore;//数据存储器var Pager;//分页器var PerCount;//每页的数据量var Grid;//GridPanel容器function GetDataFromWebService()//从WebService获取数据{ Ext.Ajax.request( { url:'WebService.asmx/GetData', method:'POST', jsonData: { Parameter1:‘参数值’ } , success:OnGetDataSuccess, failure:OnGetDataFail } );}function OnGetDataSuccess(request,options)//数据获取成功{ Data=Ext.util.JSON.decode(request.responseText); //将获取的Json数据格式化 DataStore.loadData(GetPagerData(Data),false); DataStore.load(); //这个很重要 Pager.doLoad(0); //这个很重要}function OnGetDataFail(request,options)//获取数据失败{ alert('失败了!');}function GetPagerData(InData)//从静态数据中获取每页的数据{ var TempData=//为什么要用'd'作为json数据的根,因为从WebService获取Json数据经查看就是以'd'为根的 { 'd':[] }; if(InData.length>PerCount) { for(var i=0;i<=PerCount-1;i++) { TempData.d.push(InData.d); } } else { for(var i=0;i<=InData.d.length-1;i++) { TempData.d.push(InData.d); } } return TempData;}function SerGrid();{ Data=//获取数据之前的Loading数据 { 'd':[ { '字段1':'数据载入中','字段2':'数据载入中','字段3':'数据载入中','字段4':'数据载入中','字段5':'数据载入中' } ] }; DataStore=new Ext.data.Store( { //数据存储器 proxy:new Ext.data.MemoryProxy(GetPagerData(Data)), reader:new Ext.data.JsonReader( { root:'d' }, [ { name:'字段1' }, { name:'字段2' }, { name:'字段3' }, { name:'字段4' }, { name:'字段5' } ]) }); var ColM=new Ext.grid.ColumnModel(//行定义器 [ { header:"字段显示名1",dataIndex:"字段1",sortable:true }, { header:"字段显示名2",dataIndex:"字段2",sortable:true }, { header:"字段显示名3",dataIndex:"字段3", { header:"字段显示名4",dataIndex:"字段4", { header:"字段显示名5",dataIndex:"字段5",sortable:true } ]); Pager=new Ext.PagingToolbar( { id:'Grid_Pager', pageSize:PerCount, store:DataStore, displayInfo:true, paramNames: { start:'start',limit:'limit',cid:'cid' }, displayMsg:'显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg:'没有数据', updateInfo:function ()//重写UpdateInfo { if(this.displayEl) { var count=this.store.getCount(); var msg=count==0?this.emptyMsg:String.format(this.displayMsg,this.cursor+1,Math.min(this.cursor+this.pageSize-1,Data.d.length-1)+1,Data.d.length); this.displayEl.update(msg); } }, onLoad:function (store,r,o)//重写OnLoad { if(!this.rendered) { this.dsLoaded=[store,o]; return ; } var d=this.getPageData(),ap=d.activePage,ps=d.pages; this.afterTextEl.el.innerHTML=String.format(this.afterPageText,d.pages); this.field.dom.value=ap; this.first.setdisabled(ap==1); this.prev.setdisabled(ap==1); this.next.setdisabled(ap==ps); this.last.setdisabled(ap==ps); this.loading.enable(); this.updateInfo(); }, doLoad:function (start)//重写doLoad { var TempData= { 'd':[] }; var i=0; var len=this.pageSize; for(i=0;i<len;i++) { if(Data.d[start+i]!=null) { TempData.d.push(Data.d[start+i]); } } this.store.loadData(TempData,false); }, getPageData:function ()//重写getPageData { var total=Data.d.length; return { total:total, activePage:Math.ceil((this.cursor+this.pageSize)/this.pageSize), pages:total<this.pageSize?1:Math.ceil(total/this.pageSize) }; }, onClick:function (which)//重写onClick { switch(which) { case "first": this.doLoad(0); break; case "prev": var t=this.cursor; this.cursor=Math.max(0,t-this.pageSize); this.doLoad(Math.max(0,t-this.pageSize)); break; case "next": var t=this.cursor; this.cursor=t+this.pageSize; this.doLoad(t+this.pageSize); break; case "last": var total=Data.d.length; var extra=total%this.pageSize; var lastStart=extra?(total-extra):total-this.pageSize; this.cursor=extra?(total-extra):total-this.pageSize; this.doLoad(lastStart); break; case "refresh": var t=this.cursor; this.cursor=t; this.doLoad(t); break; } } }); Grid=new Ext.grid.GridPanel( { cm:ColM, sm:new Ext.grid.RowSelectionModel( { singleSelect:true }), loadMask: { msg:'正在统计,请稍候.' }, id:'Grid', title:'Grid', autoHeight:true, autoWidth:true, bbar:Pager }); DataStore.load(); //这个很重要,用来显示Loading数据}funtionMain(){ Grid.render(Ext.getBody()); GetDataFromWebService();}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。