我有这个grails应用程序,我添加了一个数字字段和一个按钮,点击后会传递查询参数,特别是偏移值,这样用户就可以更快地导航到特定页面,因为分页最多有2000多个页面,你可以想象导航它。无论如何,我的问题是,我用jquery处理偏移量,一切都很好,但当我在数字字段上按enter键时,会触发与控制器结合构建的表单,实际上会过滤回第1页。所以我想知道是否有人知道我该如何添加一个额外的字段,当提交带有过滤器的表单时,该字段也会传递偏移值。很抱歉没有代码发布,但这个应用程序是一个怪物,我在Grails或Spring引导方面很糟糕。感谢您的支持。
你指的是2000页还是2000行。
此外,我认为如果你分享一些来自的代码
-
控制器方法
-
GSP(因此是.gps文件(
-
Javascript实现
它将让很多人了解如何帮助我们解决问题
我会为那些可能寻找答案的人发布答案。
Grails分页使用TwitterBootstrapTagLib类,您可以在那里找到分页逻辑。它在会话参数中查找"offset"变量,如果找不到,则创建一个。现在,解决方案比设置"偏移量"变量有点棘手,因为当你这样做时,你会禁用分页箭头,为什么?解释太久了,但相信我,你会的。
为了避免必须控制分页的所有其他部分,而分页在这个类中做得很好,您可以在调用需要分页的数据的控制器中创建一个新的会话变量,例如_offset。
def controllerActionX() {
...
if(params.containsKey('offset') && !params.containsKey('_offset')){
params['_offset'] = params.offset
}
...
}
您需要首先进行检查,因为在第二次迭代中,您不想将偏移量重新分配给_offset,因为那样您将被困在一页中。还要注意,偏移量已经存在于会话中,由引导类分配。
然后在视图中创建字段:
<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}"/>
这是不言自明的,然而,_offset字段中的值是一个人输入的值,因此我们仍然需要根据每页的最大记录来计算偏移量,即为了在每页10条记录的基础上获得第2页,我们的偏移量必须在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
就是这样。记住在计算时将变量强制转换为整数;之后您不必将它们转换为String,因为这是由会话处理的。
顺便说一句,这是一个写得很差的应用程序,因为服务层永远不应该处理任何端点事务,如果我们遵循正确的SOLID和MVC原则,这只是控制器的工作,但我发现这个应用程序是这样的,所以我不得不使用它