ext表格分页不成功, 显示有22条记录,一共两页,但是却把所有数据都放在同一页上显示了.

如图所示:
[img]http://dl.iteye.com/upload/attachment/186170/9ac17176-f3d8-3d25-b5c6-cecb308cd9e3.jpg[/img]

我计划每页显示20天, 查询出22条记录, 应该把多余的放在第二页显示.
但是实际上所有数据都出现在第一页了.

我的关键代码:
1. 定义了store. 分页参数是0,20
[code="js"]
var store = new Ext.data.JsonStore({
url:'xxxxx',

baseParams:{start:0, limit:20},

totalProperty: "totalProperty",

root: "root",

idProperty: "MYID",

fields:[
{name: 'MYID', mapping: 'MYID'}
...

]

});
[/code]

  1. pageingToolbar. 每页限制20条. 使用的store:store
    [code="js"]
    bbar: new Ext.PagingToolbar({
    pageSize:20
    ,store:store
    ,displayInfo:true
    ,displayMsg:'显示第{0}数据到{1},一共有{2}条'
    ,emptyMsg:'没有记录'
    });
    [/code]

  2. java中返回给store的方法构造如下
    [code="java"]
    // 查询得到所有记录
    List> resultList = sqlMapClient.queryForList("abc");
    if(null == resultList){return null;}

// 组装返回结果
Map resultMap = new HashMap();
// 记录条数
resultMap.put("totalProperty", resultList.size());
// root
resultMap.put("root", resultList);
// MYID是我记录中的一个字段
resultMap.put("id", "MYID");
// 然后将这个resultMap转为json返回给前台
[/code]

不明白, 为什么我的分页不成功, 我拿官网上列子和我对比, 也没找到区别..

另外再多请教一个问题, EXT的分页是内存分页么.
我看官网的例子[url]http://www.extjs.com/deploy/dev/examples/grid/paging.html[/url],
它访问的URL中有6000多的记录. 这么多记录全加到内存中再分页的?

[b]问题补充:[/b]


OK.
hearken01:
你的意思是
[code="java"]
for(int i = start; i < (list.size() - limit) > 0 ? limit : list.size(); i++)
{
// then return these results ?
}
[/code]

这是内存分页的做法..
定义了baseParams:{start:0, limit:20}
当点下了下一页的时候, 使start = 21. and go on

既然, start limit已经被传到了java中, 那我可否更进一步, 赋给SQL

[code="sql"]
select * from mytab where offset = #start# and limit = #limit#
[/code]

这就是数据库分页了.
[color=red]但是这样有个问题..
怎么才能到最后一页呢[/color]
[b]问题补充:[/b]
如果使用了数据库分页的话, 返回的总是当前页数据, 无法计算totalProperty, 也就不知道有几页了啊~
[b]问题补充:[/b]
谢谢, 我已经做出来了.
最后采用的数据库分页.

方法是:
1. 把start, limit一直传到sql中, 数据库查询出记录.
2. 多写一条SQL. 把记录总条数查出来.
3. 组转一个Map. root指向记录集合. totalProperty指向总条数.

这样, 每次点上一页, 下一页就能数据库分页. 压力转移到了数据库上.

不过这样做还有个暇疵.
每次查询的时候, 都要多一条SQL去查总记录数.
由于查询是不加锁的, 万一当我查询出记录后, 另一个操作把记录全干掉...就那啥杯具了.

不知大大有啥好办法没?

0

4个回答

[quote]不过这样做还有个暇疵.
每次查询的时候, 都要多一条SQL去查总记录数.
由于查询是不加锁的, 万一当我查询出记录后, 另一个操作把记录全干掉...就那啥杯具了. [/quote]

大家都这么干的,这个要具体情况具体分析的,看你数据库压力大不大,如果太大,就要考虑内存分页,减少数据库负荷,如果不是很大就用 这个吧,这些问题都是后期考虑的事情,甚至是你做完一个项目在还没有来得及考虑之前,这个项目就死了,呵呵,什么扩展性?扩展个啥?都是概念而已,,,扩展一个我还不如重新做一个,性能?等你用户起来再来优化吧。。。如果你比较负责一点,可以搞压力测试,看看瓶颈在哪,以作出对应的优化方案。。。

至于数据同步,你都说了,没锁,要么你换ORACLE了。程序能干的最大限度整个事务出来,但也是方法级别的,你需要的是SQL级别的,每一条SQL都能被拦截掉的,那就只有靠数据库了。而且,可以肯定,开了锁,开起来更卡卡了,,,本来数据库向来都是瓶颈。。。就别 折腾他了,数据不同嘛,没什么严重的,当然,如果你是银行啊,股票啊这些对数据要求比较高的另当别论,那就只有牺牲性能了。

最后,欢迎加入数据库分页的队伍 :arrow:

0

grid不会帮你分页的,要你自己在后台接收start和limit参数值,然后通过程序去分页,把分页后的结果返回给grid显示。

0

bbar:new Ext.PagingToolbar({// 分页显示数据
store:store,
displayInfo:true,
pageSize:20
})
totalProperty: "totalProperty",

Ext会根据你的指定的pageSize和totalPropert自动计算> >|对应的索引start,然后调用对应JS将start,limit作为参数传送给后台。

0

引用:
如果使用了数据库分页的话, 返回的总是当前页数据, 无法计算totalProperty, 也就不知道有几页了啊~

你在后台查询的时候,执行两条语句,一条语句是查询总条数的,另外一条语句只把要查询的20条数据取出来,不要一次把全部数据读取出来,数据少的时候你就觉得没问题,但是一旦数据上万条或者更多的时候,就非常耗资源。
查询总条数据
select count(id) from a where xx=xx
查询数据(mysql的)
select * from a where xx=xx limit 0,20// 从第一条开始,取20条。

引用:
这就是数据库分页了.
但是这样有个问题..
怎么才能到最后一页呢

当你按下一页或者上一页的时候,Ext会返回一个的start给后台的(Ext根据store里的pageSize:20和totalProperty:"totalProperty"来计算),你在后台输入一下接收到的start就知道了。
displayMsg:'显示第{0}数据到{1},一共有{2}条'//里面的{0}和{1}就是计算得出的,而{2}就是totalProperty的值。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!