【问题标题】:Grails : Implement Pagination without domain classGrails:在没有域类的情况下实现分页
【发布时间】:2017-01-21 04:21:48
【问题描述】:

我是 Groovy Grails 的新手,想在图像文件列表上实现分页。

在我的代码中我没有域类,我只是从文件系统中获取图像列表并在 gsp 页面上显示图像。

现在我想对正在显示的图像进行分页。

下面是显示图像文件的 gsp 页面。

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="filterList" %>
<html>
<head>
    <title>PC Screen Shots</title>
    <meta content="xenonPC" name="layout">
    <style>
    .mycontent-left {
        border-right: 1px solid #808080;
    }
    </style>
</head>

<body>

<div class="col-md-12">

    <section class="gallery-env">
        <div class="">

            <div class="album-images row">

                <g:set var="selectedUser" value="${selectedUser}"/>
                <g:each in="${imageList}" var="imageName">
                    <!-- Album Image -->
                    <div class="col-md-3 col-sm-4 col-xs-6">
                        <div class="album-image">
                            <a href="#" class="thumb" data-action="edit">
                                <img style="width: auto; height: 160px;"
                                     src="${createLink(controller: "customer", action: "displayImage", params: [imageName: imageName])}"
                                     class="img-responsive">
                            </a>

                            <div>
                                <g:set var="imageNameToDisplay" value="${imageName.toString()}"/>
                                <g:set var="imageNameToDisplay"
                                       value="${imageNameToDisplay.substring(imageNameToDisplay.lastIndexOf("\\") + 1)}"/>

                                <label>${imageNameToDisplay}</label>
                            </div>

                            <div>
                                <a href="#" class="thumb" data-action="edit">
                                    <img style="width: auto; height: 160px;"
                                         src="${createLink(controller: "customer", action: "displayImageDate", params: [imageName: imageName])}"
                                         class="img-responsive"
                                         style="cursor:pointer;">
                                </a>
                            </div>

                            <div class="image-options">

                                <g:link controller="customer" action="downloadImage" params="[imageName: imageName]">
                                    <i class="fa-download"></i>
                                </g:link>

                               <g:link controller="customer" action="deleteImage" params="[imageName: imageName, selectedUser: selectedUser]">
                                    <i class="fa-trash"></i>
                                </g:link>
                            </div>
                        </div>
                    </div>
                </g:each>
            </div>
        </div>
    </section>
</div>
</body>
</html>

提前致谢。

【问题讨论】:

    标签: grails pagination


    【解决方案1】:

    基本上,您需要一个将给定列表拆分为特定块的功能。分页依赖于发送,因为您知道偏移量和最大值,使用相同的分页值,您可以创建自己的自定义方法来处理给定列表:

    你需要的实际方法是这样的:

    /**
     * paginate usage:
     * paginate(inputList,pagination-params)
     * paginationParams=[offset:params.offset,max:params.max]
     * instanceList=PaginationHelper.paginate(instanceList,paginationParams)
     * @param inputList
     * @param input
     * @return list split based on offset and max
     */
    public static List splitList(List inputList, Map input) {
        input.max =  input.max ? (input.max as int) : 1
        input.offset =  input.offset ? (input.offset as int) : 0
        if (input.max < 0 ) return inputList
    
        def instanceTotal = inputList?.size()
        if ( input.offset < 0 ||  input.offset > instanceTotal) {
            input.offset = 0
        }
        // Ensure pagination does not exceed from array size
        Integer borderNumber =  input.max +  input.offset
        if (borderNumber > instanceTotal) {
            borderNumber = instanceTotal
        }
        // Extract sublist based on pagination
        def objectSubList = inputList.subList(input.offset, borderNumber)
        return objectSubList
    }
    

    要使用这种方法:

        //your current list
        def myList=[['id':1L,name:'name'],['id':2L,name:'name']]
    
        //your page total for pagination within gsp
        def instanceListTotal=myList?.size() ?: 0 
    
        //set your pagination params as per pagination input by user
        def paginationParams = [offset: params.offset, max: params.max]
    
        // get the helper class above to split it 
        def instanceList= Helper.splitList(myList,paginationParams)
    
        //respond back with split result and actual total for pagination
        render (view:'view', model:[instanceList:instanceList,instanceListTotal:instanceListTotal])
    

    所以实际上使用上面的分页。不推荐,但是棘手的情况需要非常规的解决方案。

    这里的区别和典型的分页会做什么应该是显而易见的,但在典型的数据库查询模型中。在这种情况下,没有像 myList 这样的整体列表。它被指定返回的起点和最大值,然后开始执行新的查询。 在这种情况下,分页取决于列表大小,虽然它起作用,但每次分页更改时都必须一遍又一遍地加载整个列表。 您可能希望使用某种形式的缓存解决方案来减少这里的工作。

    【讨论】:

    • 谢谢。这正是我想要的。
    猜你喜欢
    • 2012-02-21
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2018-10-30
    • 2011-12-30
    • 2013-10-15
    相关资源
    最近更新 更多