Grails 如何传递列表值以使paginate正确渲染?

Grails 如何传递列表值以使paginate正确渲染?,grails,groovy,pagination,Grails,Groovy,Pagination,我想在一个页面中显示所有项目的任务,因为用户可以有许多项目。在这种情况下,用户将从下拉列表框中选择任何一个项目,我使用以下方法找到该项目实例: def proj = params.managersProject // this is the choice made by the manager def project = Project.findByName("$proj") 现在我在project实例中获得了所有详细信息。现在我需要显示该特定项目的任务。

我想在一个页面中显示所有
项目
任务
,因为用户可以有许多
项目
。在这种情况下,用户将从下拉列表框中选择任何一个
项目
,我使用以下方法找到该项目实例:

    def proj = params.managersProject // this is the choice made by the manager 
    def project = Project.findByName("$proj")
现在我在
project
实例中获得了所有详细信息。现在我需要显示该特定项目的
任务
。因为它有太多的
任务
,所以我需要对它进行分页。但是要使分页正常工作,我想我们需要像这样传递
params

Project.list(params) // which will be passed on to the views for rendering. 
但是在我的例子中,我不能调用前面得到的
project
实例上的
list()
方法。我如何解决这个问题

编辑: 在从中得到答案后,我尝试了以下方法:

 def tasks = Tasks.findAllByProject( project, params )
    def size = tasks.size()
    params.max = Math.min(params.max ? params.int('max') : 10,100)
    return [tasksInstanceList: Tasks.findAllByProject(project,params), tasksInstanceTotal: size]
这将返回结果,但是当我单击
next
按钮时,我没有看到任何正在呈现的表。之后,当我点击
prev
按钮时,我什么也看不到。我清楚地知道,
tasksInstanceList
存在一些问题,我不确定
params
是否正在传入它。但当我点击
prev
next
按钮时,我可以清楚地看到我的浏览器添加了以下内容:

http://localhost:8080/app/controller?offset=0&max=10
致:

在视图文件中,我有以下代码:

<g:paginate total="${tasksInstanceTotal}"/>

因为我是grails的新手,所以我需要一些帮助

提前感谢。

您可以使用:

def proj = params.managersProject // this is the choice made by the manager 
def project = Project.findByName("$proj")
def tasks = Task.findByProject( project, params )

max
offset
在哪里?

我可能不是分页方面的完美专家(我自己通常会有点被它绊倒),但是如果项目的任务有很多属性,您可能会尝试分页,那么project.list()可能不是您想要的

如果您的参数有一个.max和.offset(如中所示,您使用的是标记,并且您为其提供了一个任务列表控制器操作),那么我通常会使用一个criteriaBuilder,其返回类型有些模糊。我猜有更好的办法,但是

def yourProjectInstance = Project.get(params.yourProjectId)
def taskPagedResult = Task.createCriteria().list(max: params.max as Integer, offset: params.offset as Integer) {
  eq('project', yourProjectInstance)
  //optionally, if you're using sortableColumn here as well, you can do
  //order(params.sort, params.order)
}

render view: 'taskPagedTable', model: [taskList: taskPagedResult, taskCount: taskPagedResult.totalCount()]
应将params.max任务列表放在视图的taskList中,但仍应在taskCount变量中提供该项目的任务总数

希望有帮助

参考:

编辑:

我猜这里缺少的是paginate标记的action属性,特别是当精确地点击URL为您生成正确的结果时。 您需要将paginate标记指向代码块中的任何控制器操作

在查看控制器代码时,我可以想到的另一件事是,您的大小变量可能有误导性;这将和params.max的情况一样。这就是我答案的PagedResultList部分发挥作用的地方。要么是这样,要么你的尺寸等于

def size = Tasks.countByProject(project)

这样,您的g:paginate标记的total属性将是准确的。

No我实际上是通过以下代码设置的:
params.max=Math.min(params.max?params.int('max'):15100)
。但是我没有在我的问题中说明。然而,Ant的,无论你的最大值和偏移量在哪里,都会在地图中传递它们,就像Tim传递它们一样。findByProject是处理这个问题的最简单方法(比我的方法简单得多)。如果你发现你的歧视标准在你需要一个标准构建器的地方变得足够复杂,我的回答可能会很有用,但蒂姆有一个更正确的回答:)@Tim_-yates:这很有效。但是我把
offset
max
概念搞混了。值得注意的是,我使用了通过scaffolding生成的
任务
类的列表页面作为这个控制器操作的视图文件,我做了一些轻微的更改。但这导致了一半的产出!表示“上一页”和“下一页”按钮不起作用,分页操作不正常!我该如何克服这一点?你必须对问题进行更好的描述,而不是在问题或其他方面。。。您要发送的
max
offset
的值是多少?“…半个输出”是什么样子?现在是一个不同的问题,但我将编辑我的答案以帮助:)哦,伙计!我头晕。我刚刚使用了您的代码
taskPagedResult
。但还是有同样的问题!!!我在控制台上打印了
taskPagedResult
值,并注意到,当我单击“下一步”按钮时,它不会呈现结果,我只得到空数组!但是我没有在任何地方指定参数max和offset值!:(请帮帮我。你能告诉我你的项目来源的方向吗?我不知道如何解释它我得到了输出。是的,我的
参数。当我点击我的
下一步
按钮时,ManagerProject
丢失了!我恢复了它,现在它工作了:)
def size = Tasks.countByProject(project)