2012-03-06 95 views
1

我使用ExtJS 3.3.1和Grails 2.0在屏幕上进行分页,但它不像我预期的那样工作。 我跟着提示张贴在这里:Grails extJS grid paging
JS网页Grails ExtJS分页

paramNames: {start:'offset',limit:'max',sort:'sort',dir:'order'}, 
baseParams: {offset:0,max:10}, 

的pagingToolbar:

this.gridBBar = new Ext.PagingToolbar({ 
      pageSize : 10, 
      store : this.gridStore, 
      displayInfo : true, 
      displayMsg : 'Hiển thị {0} - {1} mục tìm được của {2} kết quả', 
      emptyMsg : 'Không tìm thấy dữ liệu', 
     }); 

控制器:

def result = Floor.createCriteria().list(
    max:params.int('max')?:100, 
    offset:params.int('offset')?:0 
) 
render ([count:result.totalCount,data:result] as JSON) 

但分页按钮(下一页)被禁用,因为商店只包含了10件物品,不再需要检索。
当我改变偏移到10:

paramNames: {start:'offset',limit:'max',sort:'sort',dir:'order'}, 
baseParams: {offset:10,max:10}, 

拼版时工作得很好,除了一个奇怪的事情:电网始终显示在未来10个结果(10-20为第1点击,20日至30日的记录记录第二),而不是目前的前10个结果。我不知道ExtJs和Grails合并分页的正确用法是什么。如果您在这个问题上有经验,请分享我一些信息吗?
非常感谢。

+0

你的json是什么样的?你可能想看看这个:http://shitmores.blogspot.com/2007/04/grails-ext-grid-mini-tutorial.html – chrislovecnm 2012-03-06 19:31:05

+0

返回的JSON是{“count”:10,“items”:[ {“id”:1,“name”:“AA”},{“id”:2,“name”:“B”}]}。我发现语句render([count:result.totalCount,data:result]为JSON)不正确,因为返回列表没有getTotalCount()方法或totalCount属性 – 2012-03-06 19:44:41

回答

0

哦,我很幸运。我懂了!
基于这2篇:
1. http://grails.1312388.n4.nabble.com/Find-Count-for-pagination-And-Objects-for-Criteria-td1368528.html

2. http://blog.jeffshurts.com/2010/04/grails-pagination-and-criteriabuilder/
我发现这样做的解释。因为在JSON中返回的“count”属性是从result.size()获得的,所以它总是等于网格商店的PagingToolbar的pageSize,所以商店会理解,没有更多的结果可以检索,并且它会禁用导航按钮。
这里的关键是返回查询的实际总体结果(不附加分页约束)。正常情况下,createCriteria()。list {}将返回一个ArraysList。但是,通过将寻呼PARAMS到如下列表:(参见链接1)

DomainClass.createCriteria().list(max : x, offset : y) { 
// not pass max : x, offset : y to here, inside the body 
} 

Grails将返回结果作为PagedResultList隐含(参考链接2),它提供给我们的getTotalCount()。没有任何Grails官方文档提到这个神奇的问题。 而我的问题解决了。