如何在grails中管理多个表中的分页?

如何在grails中管理多个表中的分页?,grails,groovy,Grails,Groovy,我的gsp页面中有两个表(部分),我需要在这两个表上实现分页。一个表/节的每页记录数不同(例如,第一个表每页应显示10条记录,第二个表/节每页应显示7条记录)。我使用标签实现了它。当我这么做的时候,我遇到了很多问题,如下所述 最初,它显示每个表的记录数。但当我在一个页面中单击“下一步”按钮时,整个页面都会刷新,两个表都会转到第2页,以此类推。当在一个页面中完成所有页面并在另一个表中单击“下一步”时,对于页数较少的表,它将显示空白页面,下一个表将显示新页面。例如:如果表1有5页,表2有9页,当我们

我的gsp页面中有两个表(部分),我需要在这两个表上实现分页。一个表/节的每页记录数不同(例如,第一个表每页应显示10条记录,第二个表/节每页应显示7条记录)。我使用标签实现了它。当我这么做的时候,我遇到了很多问题,如下所述

  • 最初,它显示每个表的记录数。但当我在一个页面中单击“下一步”按钮时,整个页面都会刷新,两个表都会转到第2页,以此类推。当在一个页面中完成所有页面并在另一个表中单击“下一步”时,对于页数较少的表,它将显示空白页面,下一个表将显示新页面。例如:如果表1有5页,表2有9页,当我们转到第二个表的第6页时,第一个表显示为空白

  • 有时,当我单击“下一步”按钮时,显示的记录数不一致。有时每页显示10条记录,下次显示5条这样的记录。这两个表都会发生

  • 这是对控制器方法的普通调用,而不是ajax调用。你能给我一个ajax通话的例子吗

  • 有人能帮我解决这些问题吗?如果有人能给我控制器和gsp页面的代码来实现多分页,我将不胜感激


    提前感谢。

    我不知道是否有更简单的解决方案,但对于这些情况,我复制了paginate标记的源代码,并创建了一个新的secondTablePaginate标记。在GSP和源代码中将新标记的参数更改为secondTableTotal和secondTableOffset,您应该都已设置好。

    首先假设您有以下类

    语言

    class Language {
    
        String name
    
        static constraints = {}
    }
    

    class Person {
     String name
    
     static constraints = {}
    }
    
    首先,我们需要定义是否要使用AJAX。为什么呢?因为在使用静态页面时,需要将两个分页的参数传递给控制器操作,并从控制器操作传递参数。使用AJAX时,最好有两个不同的操作,这样就不必将所有参数传递给该操作

    对于本例,我们将使用更简单的AJAX路径

    首先,我们需要确定分页标记需要哪些数据

    • 总计:此项是标签所需的
    • 操作:因为我们将有两个不同的操作,所以我们需要指定标签将使用哪个操作
    • 控制器:如果您在不同的控制器中生成列表
    • 偏移量:页面的偏移量
    • max:页面中的最大元素数
    现在让我们假设我们将把这两个动作放在一个名为main的控制器中

    class MainController {
    
        /**The action that will load the list of people*/
        def personaList(){
    
            params.max = params?.max ?: 10
            params.offset = params?.offset ?: 0
            def personList = Person.list(params)
    
            render template: 'personaList',
            model: [
                personList : personList,
                personTotal: Person.count,
                max: params.max,
                offset: params.offset
            ]
        }
    
    
        /**The action that will load the list of languages*/
        def languageList(){
    
            params.max = params?.max ?: 10
            params.offset = params?.offset ?: 0
            def languageList = Language.list(params)
    
            render template: 'languageList',
                    model: [
                            languageList : languageList,
                            languageTotal: Language.count,
                            max: params.max,
                            offset: params.offset
                    ]
        }
    }
    
    既然我们要使用ajax,那么我们应该使用模板来渲染。我们将为每个动作创建一个模板进行渲染

    语言模板\u语言列表

    <table>
        <thead>
        <tr><th>Name</th></tr>
        </thead>
        <tbody>
        <g:each in="${languageList}" var="language">
            <tr>
                <td>${language.name}</td>
            </tr>
        </g:each>
        </tbody>
    </table>
    
    <div class="paginate">
        <g:paginate total="${languageTotal ?: fraglist.Language.count}" 
                   controller="main" action="languageList"
                   max="${max ?: 10}" offset="${offset ?: 0}" />
    </div>
    
    
    名称
    ${language.name}
    
    人物角色模板\u人物列表

    <table>
        <thead>
            <tr><th>Name</th></tr>
        </thead>
        <tbody>
            <g:each in="${personList}" var="person">
                <tr>
                    <td>${person.name}</td>
                </tr>
            </g:each>
        </tbody>
    </table>
    
    <div class="paginate">
        <g:paginate total="${personTotal ?: fraglist.Person.count}" controller="main" action="personaList"
                    max="${max ?: 10}" offset="${offset ?: 0}" />
    </div>
    
    
    名称
    ${person.name}
    
    最后,在我们看来,我们需要添加一点jquery。jquery函数将click事件处理程序添加到由paginate标记创建的所有链接中。对于每个表的默认情况,我们使用include标记。我们还定义了两个元素,每个列表将在其中加载其新内容

    <!DOCTYPE html>
    <html>
        <head>
            <meta name="layout" content="main"/>
            <title>Welcome to Grails</title>
        </head>
        <body>
    
            <div id="table-person" class="table-container">
                <g:include controller="main" action="personaList" />
            </div>
    
            <div id="table-language" class="table-container">
                <g:include controller="main" action="languageList" />
            </div>
    
    
            <script>
                (function($){
                    $(document).ready(function(){
                        $(".table-container").on('click', '.paginate a', function(event){
                            event.preventDefault();
                            var linkItem  =  $(this);
                            var target = linkItem.closest('div.table-container');
                            $.get(linkItem.prop('href'))
                                    .done(function(data){
                                        target.html(data);
                                    }).fail(function(){
                                        alert("There was an error loading the data");
                                    });
                        });
                    });
                })(jQuery)
            </script>
        </body>
    </html>
    
    
    欢迎来到Grails
    (函数($){
    $(文档).ready(函数(){
    $(“.table container”)。在('单击','上。为函数(事件)分页{
    event.preventDefault();
    var linkItem=$(此项);
    var target=linkItem.closest('div.table-container');
    $.get(linkItem.prop('href'))
    .完成(功能(数据){
    html(数据);
    }).fail(函数(){
    警报(“加载数据时出错”);
    });
    });
    });
    })(jQuery)
    

    这是我能想到的最简单的例子,在同一个视图中可以有两个ajax分页列表

    我也遇到了同样的问题,在我的gsp视图中,我有两个表和两个寻呼机,但是当我在一个表中分页时,我使用了另一个表,我在研究中发现了一个示例代码,它对我帮助很大,解决了我的问题,他们所做的是在会话中保存最大值和偏移量,并在g:paginate指令中使用它。我将链接保留到示例和示例代码:

    链接:

    控制器

    class PageController {
    
      def index = {
        if (params.paginate == 'Foo') {
          def fooPagination = [max: params.max, offset: params.offset]
          session.fooPagination = fooPagination
        } else if (params.paginate == 'Bar') {
          def barPagination = [max: params.max, offset: params.offset]
          session.barPagination = barPagination
        }
        def barList = Bar.list(session.barPagination ?: [max: 10, offset: 0])
        def fooList = Foo.list(session.fooPagination ?: [max: 10, offset: 0])
        //This is to stop the paginate using params.offset/max to calculate current step and use the offset/max attributes instead    
        params.offset = null
        params.max = null
        [fooList: fooList, totalFoos: Foo.count(), totalBars: Bar.count(), barList: barList]
      }
    }
    
    普惠制指数

    <html>
    <head>
      <title>Multi Pagination Example</title>
    
      <meta name="layout" content="main"/>
      <style type="text/css" media="screen">
    
      h2 {
        margin-top: 15px;
        margin-bottom: 15px;
        font-size: 1.2em;
      }
      </style>
    
    </head>
    <body>
    <table>
      <tr>
        <td>
          <h2>Foo</h2>
          <table>
            <tr>
              <th>Name</th>
            </tr>
            <g:each in="${fooList}">
              <tr><td>${it.name}</td></tr>
            </g:each>
            <tr>
              <td class="paginateButtons">
                <g:paginate total="${totalFoos}" max="10" offset="${session.fooPagination?.offset}" params="${[paginate:'Foo']}"/></td>
            </tr>
          </table>
        </td>
        <td>
          <h2>Bar</h2>
          <table>
            <tr>
              <th>Name</th>
            </tr>
            <g:each in="${barList}">
              <tr><td>${it.name}</td></tr>
            </g:each>
            <tr>
              <td class="paginateButtons">
                <g:paginate total="${totalBars}" max="10" offset="${session.barPagination?.offset}" params="${[paginate:'Bar']}"/></td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
    
    </body>
    </html>
    
    
    多分页示例
    氢{
    边缘顶部:15px;
    边缘底部:15px;
    字体大小:1.2米;
    }
    福
    名称
    ${it.name}
    酒吧
    名称
    ${it.name}
    

    我希望它能像我一样为您服务

    您需要提供一些代码“有时每页显示10条记录,下次显示5条这样的记录。”当然这就是结束查询-尝试将每个表拆分为两个单独的gsp页,看看是否先修复记录增量。这里的问题是在不同的干草堆里有各种各样的针,你想要有人给你一个所有丢失针的答案