【问题标题】:Pagination prob in GrailsGrails中的分页问题
【发布时间】:2015-11-11 17:20:03
【问题描述】:

我想在分页中显示某个类别下的所有游戏(10/页) 这是我的控制器

def listGame(){
    def category = GameCategory.list()
    def platform = Platform.list()
    def currentCategory = params.categoryName
    def myCategory=GameCategory.findByCategoryName(currentCategory)
    def games = myCategory.games

    [currentCategory:currentCategory, category:category, games:games,  platforms:platform, gameCount:Game.count(), chosenPlatform:params.platform] 
}

这是我认为的分页代码

<g:each in="${games}" status="i" var="game">
    ${game.gameTitle}
</g:each>
<div class="pagination">
            <g:paginate action="listGame" total="${gameCount}" />
</div>

当我在当前类别中有 9 个游戏时,第 12 页出现了它不应该出现的页面

当我在当前类别中有 11 款游戏时,所有 11 款游戏都显示在第 1 页中,单击第 2 页将导致此错误

【问题讨论】:

    标签: grails pagination


    【解决方案1】:

    有几件事需要解决。

    1. 确保categoryName 没有以null 的身份进入控制器。
    2. 利用分页器提供的maxoffset 参数来选择适当的Games。

    类别名称

    因为分页器正在创建调用控制器的 URL,并且您的控制器需要类别名称,所以分页器必须将类别名称添加到它调用控制器操作的参数中。您可以使用标签的params 属性来实现这一点:

    <g:paginate action="listGame" total="${gameCount}" params="${[categoryName: currentCategory]}"/>
    

    最大和偏移量

    控制器需要使用maxoffset 参数来知道要从数据库中检索Games 的哪个子集并在视图中呈现。但是,在某些情况下,例如访问 URL http://blah/someController/listGame 时,将没有 maxoffset 参数。这是您的控制器操作必须能够处理的事情。它是这样的:

    def max = params.max ?: 10
    def offset = params.offset ?: 0
    

    所以maxoffset 参数如果可用,将被使用。否则他们将使用默认值。

    最后,您需要使用这些参数来选择Games。为此,您可以使用 where 查询:

    def games = Game.where {
        categories.categoryName == currentCategory
    }.list(max: max, offset: offset)
    

    关于返回的games 对象的一些有趣之处:它的作用类似于一个列表,但它实际上是一个grails.gorm.PagedResultList。这是一件好事,因为它在结果中包含 total 条记录(忽略最大值和偏移量)。换句话说,这是你的新gameCount

    您可以在 Grails 文档中阅读有关 where 查询的更多信息。我还有一系列articles,其中更详细地介绍了位置、条件和 HQL 查询。

    把它们放在一起,listGame() 看起来像这样:

    def listGame(){
        def category = GameCategory.list()
        def platform = Platform.list()
        def currentCategory = params.categoryName
        def max = params.max ?: 10
        def offset = params.offset ?: 0
        def games = Game.where {
            categories.categoryName == currentCategory
        }.list(max: max, offset: offset)
    
        [currentCategory:currentCategory, category:category, games:games,  platforms:platform, gameCount:games.totalCount, chosenPlatform:params.platform] 
    }
    

    【讨论】:

    • 塔安克斯!!我很感激你的解释:)
    【解决方案2】:

    看来你还没有完成作业。请阅读grails doc 和其他教程,了解分页的工作原理。

    只是给你一个提示。你在这里做错了两件事。

    1. 您一开始没有从控制器获得分页列表
    2. 您没有从分页链接将所有必需的数据发送回控制器。这就是您收到错误的原因!

    【讨论】:

    • 我很困惑 1. 在文档中,控制器仅传递列表和计数,我拥有的是 [games:games, gameCount:Game.count()] 2.如何从分页发回所需的数据关联?在文档中它只是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多