1

我正在尝试在 grails 中使用分页标记,但它不起作用。

在控制器中:

def show(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    def etpse
    def total

    if (params.data == 'all') {

        etpse = Enterprise.findAll()
        total = Enterprise.count()
    }

    else {
        def paramsLike = "%" + params.data + "%"
        etpse = Enterprise.findAllByKeywordLike(paramsLike)
        total = Enterprise.countByKeywordLike(paramsLike)
    }

    [etpseList: etpse, instanceTotal: total]
}

在 gsp 中:

<div id='pagination'>
    <g:paginate total="${instanceTotal}" />
</div>
4

3 回答 3

2

paginate标签不会过滤页面中的结果,也不会呈现项目列表。它仅根据您的请求参数为下一页/上一页创建链接。

您的控制器负责获取正确的数据页面,您的 gsp 负责呈现实际的项目列表。

paginate标签参数旨在将参数与 GORM 注入方法相匹配,并且list几乎总是齐头并进:

class ItemController {
    def list() {
        [items: Item.list(params), itemCount: Item.count()]
    }
}

看法:

<g:each var="item" in="${items}">
    <!-- render items here -->
</g:each>

<g:paginate controller="item" action="list" total="${itemCount}"/>

max在上面的代码中,参数列表(包括和之类的东西offset)被传递给领域类的list方法Item,这将抓取一页数据。

paginate 标记检查相同条目的请求参数,确定您正在查看的数据页面,并使用正确的 max 和 offset 值创建指向下一页和上一页的必要链接。

于 2013-06-12T14:51:52.587 回答
2

干得好。

def show(Integer max) {

    Integer offset = params.int("offset")
    Integer max = Math.min(params.int("max") ?: 10, 100)

    if (params.data == 'all') {
        params.data = '%';
    }

    def c = Enterprise.createCriteria()
    def results = c.list(max: max, offset: offset) {
      ilike('keyword', "%" + params.data + "%")
    }


    [etpseList: results, instanceTotal: results.totalCount]
}
于 2013-06-12T18:20:54.503 回答
0

您必须将参数 max 和 offset 传递到 findAll 中,否则 Grails 不知道如何对结果集进行分页。

例如,

Book.findAll(query, [max: 10, offset: 5])

于 2013-06-12T14:52:33.033 回答