繁体   English   中英

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

[英]How to manage pagination in multiple tables in grails?

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

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

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

  3. 这是对控制器方法的常规调用,而不是ajax调用。 您能给我Ajax调用样本吗?

任何人都可以帮助我解决这些问题吗?如果有人可以给我用于多个分页实现的控制器和gsp页面的代码,我将不胜感激。

提前致谢。

首先让我们假设您具有以下课程。

语言

class Language {

    String name

    static constraints = {}
}

class Person {
 String name

 static constraints = {}
}

首先,我们需要定义是否要使用AJAX。 这是为什么? 因为在使用静态页面时,您将需要将两个分页的参数传递给控制器​​动作或从控制器动作传递。 使用AJAX时,执行两个不同的操作将更加有用,因此您不必将所有参数都传递给该操作。

对于此示例,我们将通过更简单的AJAX路径。

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

  • 总计:标记所需的一个
  • 操作:由于我们将要执行2个不同的操作,因此我们需要指定代码将使用哪个操作
  • 控制器:如果您在不同的控制器中生成列表
  • offset:页面的偏移量
  • 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,因此我们应该使用模板进行渲染。 我们将创建一个模板来为每个动作呈现

语言模板 _languateList

<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>

角色模板 _personList

<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>

最后,在我们看来,我们需要添加一些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>

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

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

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

链接: https//code-examples.net/es/q/3de823

控制者

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]
  }
}

index.gsp

<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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM