[Ext JS 4] Grid 实战之分页功能
前言
分页功能的实现有两种途径:
一种是服务端分页方式, 也就是web客户端传递页码参数给服务端,服务端根据页面参数返回指定条数的数据。也就是要多少取多少。这种方式比较适合Grid 的数据量很大,需分批取。
另一种是客户端分页方式, 一次性从服务端取回所有的数据在客户端这边实现分页。这种自然适合数据量较少的状况,减少和服务端的交互, 对性能有一些帮助。这种方式还有一种好处就是对于初学Ext JS Grid 或分页功能比较简单和直观了。
Ext 目前的官方文档中,对于客户端分页的方式介绍和实例不多,而服务端的方式,跟具体的服务端的技术相关,Ext 也就没做太多的介绍了。
本篇先介绍分页实现的思想,然后从客户端的实现方式介绍开始,毕竟测试起来简单一些;最后介绍服务端的方式。
分页的效果:

Grid Panel 分页实现思想
要在Grid上实现分页功能,
首先要给这个Grid Panel 添加一个 Ext.PagingToolbar
添加的方式可以使用 bbar 的config 添加到button bar
也可以使用dockedItems 的 config 添加
类似:
bbar: Ext.create('Ext.PagingToolbar',{
store: store,
displayInfo: true,
displayMsg: 'Displaying topics {0} - {1} of {2}',
emptyMsg: "No topics to display",
}
),
或是:
dockedItems: [{
xtype: 'pagingtoolbar',
store: store, // same store GridPanel is using
dock: 'bottom',
displayInfo: true
}]
使用Ext.create 或是直接在 [] config 都可以。
接下来就是这个store 的处理了。page 的store和一般的store 会有一些差别的地方,下面会介绍到。
客户端分页方式(local data)
Ext JS 中将客户端的分页也叫“local data‘ 的分页。
在Ext JS 的官方文档中有提到关于PageingStore这样一篇介绍
这种方式通过添加一些新的Class 的方式实现。而且这个扩展包是针对Ext js 3.x 来实现的, 需要下载扩展包。
而这篇介绍里的下载link 有需要权限。总之, 有点麻烦。
在Ext JS 4的新版本中,完全可以不用这种方式。
Ext JS API 中有以下这个Class, 用它构造的store 就可以实现分页效果了。
Ext.ux.data.PagingMemoryProxy proxy: pagingmemory
需要特别注意的是 Ext 的导入包中ext-all.js 并没包含这个类, 看上去这个是作为扩展包。
所以使用前需要导入这个包的 定义js 文件,或是使用Ext 的动态载入方式导入。
直接看例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title> <script type="text/javascript" src="../lib/extjs/ext-all.js"></script>
<script type="text/javascript" src="../lib/extjs/ux/data/PagingMemoryProxy.js"></script> <link rel="stylesheet" type="text/css" href="../lib/extjs/resources/ext-theme-neptune/ext-theme-neptune-all.css" /> <script type="text/javascript"> Ext.onReady(function(){ var itemsPerPage = 4;
var store = Ext.create('Ext.data.Store', {
fields:['name', 'email', 'phone'],
pageSize: itemsPerPage,
proxy: {
type: 'pagingmemory',
data: [
{ 'name': 'ALisa', "email":"lisa@simpsons.com", "phone":"555-111-1224" },
{ 'name': 'Bart', "email":"bart@simpsons.com", "phone":"555-222-1234" },
{ 'name': 'Homer', "email":"home@simpsons.com", "phone":"555-222-1244" },
{ 'name': 'Marge', "email":"marge@simpsons.com", "phone":"555-222-1254" },
{ 'name': 'Lisa', "email":"lisa@simpsons.com", "phone":"555-111-1224" },
{ 'name': 'Bart', "email":"bart@simpsons.com", "phone":"555-222-1234" },
{ 'name': 'Homer', "email":"home@simpsons.com", "phone":"555-222-1244" },
{ 'name': 'Lisa', "email":"lisa@simpsons.com", "phone":"555-111-1224" },
{ 'name': 'Bart', "email":"bart@simpsons.com", "phone":"555-222-1234" },
{ 'name': 'Homer', "email":"home@simpsons.com", "phone":"555-222-1244" },
{ 'name': 'Marge', "email":"marge@simpsons.com", "phone":"555-222-1254" }
]
}
}); store.loadPage(1); Ext.create('Ext.grid.Panel', {
title: 'Simpsons',
store: store,
columns: [
{ text: 'Name', dataIndex: 'name' },
{ text: 'Email', dataIndex: 'email', flex: 1 },
{ text: 'Phone', dataIndex: 'phone' }
],
height: 200,
width: '100%',
dockedItems: [{
xtype: 'pagingtoolbar',
store: store, // same store GridPanel is using
dock: 'bottom',
displayInfo: true
}],
renderTo: Ext.getBody()
}); });
</script> </head>
<body> </body>
</html>
需要说明的:
1.一定要导入PagingMemoryProxy.js
<script type="text/javascript" src="../lib/extjs/ux/data/PagingMemoryProxy.js"></script>
也可以使用动态导入的方式(先设置允许动态导入和导入的文件路径,接着使用require 方式导入)
Ext.Loader.setConfig({enabled: true});
Ext.Loader.setPath('Ext.ux', 'lib/extjs/ux');
Ext.require([
'Ext.ux.data.PagingMemoryProxy'
]);
2. store 的proxy 里的type一定要是 'pagingmemory'。 如果要是按照一般的store 方式定义。
则在页面上 toolbar 会有, 但是一次会把所有数据显示出来, 翻页就没什么效果了。
服务器端分页方式
服务器端的分页方式和客户端比较起来,差别仅仅在store 的定义上。
添加的PagingToolbar有前进或后退按钮,点击的时候是会把页面的一些信息通过url 传递到服务端。类似 ?_dc=1374646308167&page=2&start=4&limit=4
以jsp 来说,就可以通过request.getParameter得到这些值了。
String sPage = request.getParameter("page");
String sStart = request.getParameter("start");
String sLimit = request.getParameter("limit");
有了这些值,就可以在服务端做一些过滤了, 看例子:有两个文件
testPageGrid.html
pageGridData.jsp -- jsp 输出服务端数据
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title> <script type="text/javascript" src="../lib/extjs/ext-all.js"></script>
<link rel="stylesheet" type="text/css" href="../lib/extjs/resources/ext-theme-neptune/ext-theme-neptune-all.css" />
<script> Ext.Loader.setConfig({enabled: true});
Ext.Loader.setPath('Ext.ux', '../lib/extjs/ux');
Ext.require([
'Ext.ux.data.PagingMemoryProxy'
]); Ext.onReady(function(){
var itemsPerPage = 4;
var store = Ext.create('Ext.data.Store', {
fields:['name', 'email', 'phone'],
pageSize: itemsPerPage,
proxy: {
type: 'ajax',
url: 'pageGridData.jsp',
reader: {
root: 'items',
totalProperty: 'totalCount'
}
}
}); store.loadPage(1); Ext.create('Ext.grid.Panel', {
title: 'Simpsons',
store: store,
columns: [
{ text: 'Name', dataIndex: 'name' },
{ text: 'Email', dataIndex: 'email', flex: 1 },
{ text: 'Phone', dataIndex: 'phone' }
],
height: 200,
width: '100%',
dockedItems: [{
xtype: 'pagingtoolbar',
store: store, // same store GridPanel is using
dock: 'bottom',
displayInfo: true
}],
renderTo: Ext.getBody()
}); });
</script>
</head>
<body> </body>
</html>
<%
response.setContentType( "text/html; charset=UTF-8" ); //page=2&start=4&limit=4
String sPage = request.getParameter("page");
String sStart = request.getParameter("start");
String sLimit = request.getParameter("limit");
int iPage = Integer.valueOf(sPage);
int iStart = Integer.valueOf(sStart);
int iLimit = Integer.valueOf(sLimit);
int totalCount = 12; StringBuffer dataBuffer = new StringBuffer();
dataBuffer.append("{totalCount:'").append(totalCount).append("',");
dataBuffer.append("items:["); for(int i =0;i<iLimit;i++)
{
dataBuffer.append("{");
String name = "jack_"+sPage+"_"+String.valueOf(i);
String mail = "jack"+sPage+"_"+String.valueOf(i)+"@email.com";
String phone = "000-"+sPage+"_"+String.valueOf(i);
dataBuffer.append("name:'"+name+"',");
dataBuffer.append("email:'"+mail+"',");
dataBuffer.append("phone:'"+phone+"'");
dataBuffer.append("}");
if(i<iLimit-1)
{
dataBuffer.append(",");
}
} dataBuffer.append("]");
dataBuffer.append("}");
out.write(dataBuffer.toString());
out.flush();
%>
需特别注意的是:
1. 一定要通过http url 的方式访问测试。放在tomcat 或是weblogic 中。
2. store 中要指定reader 的totalProperty。否则就只有一页了。
[Ext JS 4] Grid 实战之分页功能的更多相关文章
- 新书《Ext JS 4.2 实战》终于出炉了
在清华大学出版社网站看到了书籍信息了,具体地址是:http://www.tup.tsinghua.edu.cn/book/Showbook.asp?CPBH=056140-01&DJ=51 预 ...
- 新书《Ext JS 4.2实战》即将出版
目录: 第1章 Ext JS 4概述1.1 从Ext JS 4.0到4.071.2 从4.1到4.1.1a1.3 从4.2到4.2.11.4 如何选择版本1.5 基 ...
- 《Ext JS 4.2 实战》可以买了
今天编辑告诉我,在网上可以买到这书了,购买链接是http://www.amazon.cn/Ext-JS-4-2%E5%AE%9E%E6%88%98-%E9%BB%84%E7%81%AF%E6%A1%A ...
- [js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)
该系列文章索引: [js高手之路]node js系列课程-创建简易web服务器与文件读写 [js高手之路]node js系列课程-图解express+supervisor+ejs用法 [js高手之路] ...
- [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
引言 贴一个grid 的例子先: 有这样一个需求: 1. 给 Grid(or Tree Grid)添加一列, 这一列显示是Button. 点击之后可以对这一行进行一些操作 2. 这一列每一行对应的按钮 ...
- Ext JS 6学习文档-第5章-表格组件(grid)
Ext JS 6学习文档-第5章-表格组件(grid) 使用 Grid 本章将探索 Ext JS 的高级组件 grid .还将使用它帮助读者建立一个功能齐全的公司目录.本章介绍下列几点主题: 基本的 ...
- [转]使用Sencha Ext JS 6打造通用应用程序
原文地址:http://www.uedsc.com/using-sencha-ext-js-6-to-build-universal-apps.html 在Sencha和整个Ext JS团队的支持下, ...
- Ext JS 6开发实例(一)
很久没写文章了,主要原因和大家差不多,都要为生活奔忙,搞了两个小项目.这两个小项目很凑巧,都可以使用Ext JS来开发,这正是练习使用Ext JS 6的好机会,自然不会错过. 很多读者可能会问,为什么 ...
- 【翻译】使用Sencha Ext JS 6打造通用应用程序
原文:Using Sencha Ext JS 6 to Build Universal Apps {.aligncenter} 在Sencha和整个Ext JS团队的支持下,我很高兴能跟大家分享一下有 ...
随机推荐
- python计算md5值
from hashlib import md5 m = md5(') print m.hexdigest()
- SQL Server 数据库的自动选项
自动选项影响SQL Server 可能会自动进行的操作,所有的这些都是bool值,值为on 或off 1. auto_close: 当这个为on 时.数据库在最后一个用户退出后完全关闭,这样数据库就不 ...
- Criteria 和 DetachedCriteria的区别与使用(转)
转自:http://javapub.iteye.com/blog/1149709 Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的, ...
- 论山寨手机与Android 【13】SmartPhone AP系统
在第9章中我们提到,从功能上讲对于智能手机的一个粗略的概括是,智能手机 == 电脑 + 移动网卡,或者更准确地说,智能手机的硬件结构分为应用程序处理器AP,和基带处理器BP两个部分.这里隐含着两个问题 ...
- GDI编程
图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...
- iOS开发之GCD使用总结
GCD是iOS的一种底层多线程机制,今天总结一下GCD的常用API和概念,希望对大家的学习起到帮助作用. GCD队列的概念 在多线程开发当中,程序员只要将想做的事情定义好,并追加到DispatchQu ...
- 用Meta 取消流量器缓存实现每次访问都刷新页面方便调试
如果想禁止浏览器从本地缓存中调阅页面,可以设置网页不保存在缓存中,每次访问都刷新页面,下面是Meta在这方便的用法,需要的朋友可以参考下: <!-- 禁止浏览器从本地缓存中调阅页面.--> ...
- <select>标签后循环加入选项<option>——jquery
if (data.ReplaceDataFields != null) { $.each(data.ReplaceDataFields, function (i, item) { ...
- js正则验证两位小数 验证数字最简单正则表达式大全
<h3>输入完按回车后即可验证!(自认为最简单!)</h3> 正整数: <input type="text" size="20&quo ...
- spring security执行流程图
今天看到非常多人转载了这篇文章,这里备注一下.原文来自CSDN我的博客. 近期在研究spring security的配置,研究了一个星期了,在官网看了下.仅仅配置出来了简单的登录,但不知如何从数据库读 ...