2014-05-12 21 views

回答

0

这是我的解决方案

在控制器:

params.max = 30 
if(params.long('page')) { 
    params.offset = (params.long('page') - 1) * params.max 
} 

在标记库:

static namespace = "my" 

private final static Pattern OFFSET_PATTERN = Pattern.compile("offset=(\\d+)"); 

def paginate = { attrs, body -> 
    String str = g.paginate(attrs) // using grails gsp paginate tag 
    // make sure we delete max param with & (before or after) 
    str = str.replaceAll(/&max=\d+/, '').replaceAll(/max=\d+&/, '') 
    while (true) { 
     Matcher matcher = OFFSET_PATTERN.matcher(str) 
     if (matcher.find()) { 
      long pageNum = (matcher.group(1) as long)/params.long('max') + 1 
      // replace offset=0 with page=1, offset=30 with page=2, etc 
      str = matcher.replaceFirst('page=' + pageNum) 
     } else { 
      break; 
     } 
    } 
    out << str 
} 

因此,我们可以在我们的GSP视图使用my.paginate我们使用标准的相同方式grails gsp分页标记。期待您的反馈和改进

1

您可以更改控制器本身。沿线的东西:

def myMethod() { 
    params.max = 30 
    params.offset = (params.max * params.page) - params.max //todo - make sure page is bigger than one :-) 
    def listOfItemsYouWantToShow = MyPerfectDomainClass.list(params) 
    .... 
} 

未测试,但应该工作。

[查看标签应该也发生了变化,就像第一个评论。

+0

是的,应在课程 的控制器计算,但问题是关于PAGINATE标签 – Stingkalamar

+0

这里检查源(行号92):https://github.com/grails /grails-core/blob/master/grails-plugin-gsp/src/main/groovy/org/codehaus/groovy/grails/plugins/web/taglib/UrlMappingTagLib.groovy。改变并不难实施。将此用作实现的核心。 –

+0

我同意,这不是很难实现,但我不想重新发明轮子。我正在寻找一些优雅的解决方案,使用现有的grails标签 – Stingkalamar