将偏移选择器添加到 Grails 分页
Add Offset selector to Grails Pagination
我有这个 grails 应用程序,我添加了一个数字字段和一个按钮,单击它们会传递查询参数,特别是偏移值,以便用户可以更快地导航到特定页面,因为分页有一些在 max=10 的基础上有 2000 多页,你可以想象浏览它。无论如何,所以我的问题是我用 jquery 处理偏移量并且一切正常但是当我在数字字段上按下 enter 触发与控制器结合构建的表单并且实际上过滤回第 1 页. 所以我想知道是否有人知道我将如何添加一个额外的字段,该字段将在提交带有过滤器的表单时也传递一个偏移值。抱歉,没有 post 的代码,但这个应用程序是一个怪物,我一般不擅长 Grails 或 Spring 启动。感谢任何支持。
你的意思是 2000 页或行。
另外我想如果你分享一些来自你
的代码
控制器方法
GSP(因此是 .gps 文件)
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 原则,那只是控制器的工作,但我发现这个应用程序是这样的我不得不使用它。
我有这个 grails 应用程序,我添加了一个数字字段和一个按钮,单击它们会传递查询参数,特别是偏移值,以便用户可以更快地导航到特定页面,因为分页有一些在 max=10 的基础上有 2000 多页,你可以想象浏览它。无论如何,所以我的问题是我用 jquery 处理偏移量并且一切正常但是当我在数字字段上按下 enter 触发与控制器结合构建的表单并且实际上过滤回第 1 页. 所以我想知道是否有人知道我将如何添加一个额外的字段,该字段将在提交带有过滤器的表单时也传递一个偏移值。抱歉,没有 post 的代码,但这个应用程序是一个怪物,我一般不擅长 Grails 或 Spring 启动。感谢任何支持。
你的意思是 2000 页或行。
另外我想如果你分享一些来自你
的代码控制器方法
GSP(因此是 .gps 文件)
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 原则,那只是控制器的工作,但我发现这个应用程序是这样的我不得不使用它。