Как передать значение списка для paginate для правильной визуализации? - PullRequest
1 голос
/ 13 февраля 2012

Я хочу отобразить все project tasks на странице, учитывая, что у пользователя может быть много projects.В таком случае пользователь выберет любой project из выпадающего списка, и я нахожу этот экземпляр проекта, используя:

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

Теперь у меня есть все детали в project экземпляре.Теперь мне нужно отобразить tasks этого конкретного проекта.Поскольку у него так много tasks, мне нужно разбить его на страницы.Но для правильной работы нумерации страниц, я думаю, нам нужно передать params следующим образом:

Project.list(params) // which will be passed on to the views for rendering. 

Но в моем случае я не смог вызвать этот метод list() на projectэкземпляр, который я получил раньше.Как мне это решить?

Редактировать:

После получения ответа от tim_yates я попробовал это:

 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

на:

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

В файле просмотра у меня есть этот код:

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

Поскольку я очень плохо знаком с Граалем, мне нужна помощь.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Можете ли вы использовать:

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 на карте параметров ?

1 голос
/ 13 февраля 2012

Я, возможно, не идеальный эксперт по разбивке на страницы (обычно я сам немного разбираюсь в этом), но если это свойство hasmany Задачи проекта, которое вы пытаетесь разбить на страницы, Project.list (), вероятно, не то, что вам нужно .

Если ваши параметры имеют .max и .offset (как, например, вы используете тег , и вы предоставили ему действие контроллера списка задач), то, что я обычно делаю, это использую attributeBuilder с несколько скрытый тип возвращаемого значения PagedResultList. Я предполагаю, что есть лучший способ сделать это, но что-то вроде

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 в список задач вашего представления, но все равно дать вам общее количество задач для этого проекта в переменной taskCount.

Надеюсь, это поможет!

Ссылка: http://blog.jeffshurts.com/2010/04/grails-pagination-and-criteriabuilder/

EDIT:

Я предполагаю, что здесь отсутствует атрибут action для вашего тега paginate, особенно если точное попадание по URL дает правильные результаты для вас. Вы должны указать свой тег paginate на любое действие контроллера, имеющее ваш кодовый блок.

Еще одна вещь, которую я могу вспомнить, глядя на код вашего контроллера, - ваша переменная размера может вводить в заблуждение; это будет то же самое, что и params.max было. Вот где часть моего ответа PagedResultList вступает в игру. Либо так, либо вы могли бы иметь размер, равный

def size = Tasks.countByProject(project)

Таким образом, свойство тега g: paginate total будет точным.

...