将偏移选择器添加到 Grails 分页

Add Offset selector to Grails Pagination

我有这个 grails 应用程序,我添加了一个数字字段和一个按钮,单击它们会传递查询参数,特别是偏移值,以便用户可以更快地导航到特定页面,因为分页有一些在 max=10 的基础上有 2000 多页,你可以想象浏览它。无论如何,所以我的问题是我用 jquery 处理偏移量并且一切正常但是当我在数字字段上按下 enter 触发与控制器结合构建的表单并且实际上过滤回第 1 页. 所以我想知道是否有人知道我将如何添加一个额外的字段,该字段将在提交带有过滤器的表单时也传递一个偏移值。抱歉,没有 post 的代码,但这个应用程序是一个怪物,我一般不擅长 Grails 或 Spring 启动。感谢任何支持。

你的意思是 2000 页或行。

另外我想如果你分享一些来自你

的代码
  1. 控制器方法

  2. GSP(因此是 .gps 文件)

  3. Javascript实施

它将让很多人了解如何帮助我们解决问题

我会 post 为那些可能会寻找这个的人提供答案。

Grails 分页使用 TwitterBootstrapTagLib class,您会在那里找到分页逻辑。它在会话参数中查找 'offset' 变量,如果找不到,则创建一个。 现在的解决方案比设置 'offset' 变量有点棘手,因为这样做会禁用分页箭头,为什么?解释太长了,但相信我,你会的。

为了避免必须控制分页的所有其他部分,这在 class 中做得非常好,您可以创建一个新的会话变量,例如_offset,在控制器中调用需要分页的数据。

def controllerActionX() {
...
    if(params.containsKey('offset') &&  !params.containsKey('_offset')){
        params['_offset'] = params.offset
    }
...
}

您需要先检查一下,因为在第二次迭代中您不想将偏移量重新分配给 _offset,否则您将被困在一页中。另请注意,偏移量已存在于会话中,由 bootstrap class.

分配

然后在视图中创建字段:

<input type="submit" class="goto-page" id="goto-page" value="Go To Page"/>
<g:field type="number" class="topage-number" name="_offset" min="1" value="${params._offset?:1}"/>

这是self-explanatory,但是,_offset字段的值是人为输入的值,所以我们仍然需要根据每页的最大记录数计算偏移量,即为了得到页2 以 10 records-per-page 为基础,我们的偏移量必须在 11-19 之间,最好是 19,因为这样更容易计算。

在服务层的最后一步,我们像这样计算所有内容:

def get(HttpSession session, Map params, Xclass xUser, String status) {
....
    String offset = '0'
    if(params.containsKey('_offset')){
        if(params['_offset'] != params.offset){
              params.offset = ((params._offset as int) * (max as int)) - 1
        }else{
            params['_offset'] = (params.offset as int) / (max as int) + 1
        }
    }
    if (params.containsKey('offset')) offset = params.offset
...
    def result = executeQuery(resultsQuery,mapping, [max: max, offset: offset])
result

就是这样。记住在计算时将变量转换为整数;之后您不必将它们转换为字符串,因为这是由会话处理的。

顺便说一句,这是一个写得不好的应用程序,因为服务层永远不应该处理任何端点事务,如果我们遵循正确的 SOLID 和 MVC 原则,那只是控制器的工作,但我发现这个应用程序是这样的我不得不使用它。