Как сохранить порядок сортировки простых лиц по данным? - PullRequest
7 голосов
/ 11 октября 2011

В моем проекте я использую bean-компонент ViewScoped, и у меня есть две страницы, одна из которых является главной страницей, а другая страница подробностей.

На главной странице у меня есть простые данные с возможностью сортировки и фильтрации.У таблицы данных есть ссылка в каждой строке.Если я сортирую столбец, то он работает правильно.Если я нажму на ссылку на главной странице, то она перейдет на страницу с подробностями соответствующей строки.На странице с подробностями у меня есть кнопка возврата.Если я нажму на него, он вернется на главную страницу, но порядок сортировки не будет сохранен в таблице данных.

Мне нужно сохранить порядок сортировки.Как мне этого добиться?

Ответы [ 2 ]

8 голосов
/ 09 апреля 2013

Я знаю, что этот вопрос довольно старый, но я просто работал над этим, поэтому я решил поделиться своим решением на будущее.

Мы используем PrimeFaces 3.5

Это было реализовано только в отложенной загрузочной таблице и никогда не реализовывалось в таблице в памяти. Самое большое различие, которое может существовать, заключается в том, что вам необходимо сохранить тип столбца (Class) для таблицы в памяти.

Прежде всего, вам нужен какой-то контроллер SessionScoped, в который вы можете сохранить состояние сортировки. Вам необходимо сохранить два состояния: столбец сортировки и порядок сортировки (по возрастанию / убыванию).

Во-вторых, свяжите p: datatable с объектом в вашем контроллере ViewScoped (binding="#{viewController.datatable}") и реализуйте для него базовый метод получения и установки. В методе сеттера у меня есть это:

public void setDatatable(DataTable datatable) {
    ExpressionFactory expressionFactory = ExpressionFactory.newInstance();
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    if(!datatableInitialized) {
        if(getSessionController().getSortState() == null) {
            datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, DEFAULT_SORT_COLUMN, Object.class));
            datatable.setSortOrder(DEFAULT_SORT_DIRECTION);
        } else {
            SortState state = getSessionController().getSortState();
            datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, state.getValueExpression(), Object.class));
            datatable.setSortOrder(state.getDirection());
        }
        datatableInitialized = true;
    }
    this.datatable = datatable;
}

Важными битами являются строки setValueExpression, для второго параметра метода createValueExpression требуется выражение стиля JSF, а именно: #{pojo.stuff}. Также обратите внимание на то, что я просто использую Object.class в качестве типа, я думаю, что мне это сойдет с рук, потому что таблица загружается лениво, и я сама выполняю всю сортировку в реализации LazyDataModel.

В-третьих, добавьте событие сортировки в таблицу данных:

<p:ajax event="sort" listener="#{viewController.sortListener}" />

и слушатель в контроллере:

public void sortListener(SortEvent event) {
    SortState state = new SortState();
    state.setValueExpression(event.getSortColumn().getValueExpression("sortBy").getExpressionString());
    state.setDirection(event.isAscending() ? "ascending" : "descending");
    getSessionController().setOpportunitiesSortState(state);
}

Вот и все.

1 голос
/ 09 июля 2019

5 лет спустя PrimeFaces поддерживает эту функцию из коробки. Начиная с версии 6.0.10, PrimeFaces добавила функцию TableState . Это позволит вашей DataTable поддерживать свое состояние даже после ухода со страницы.

Как указано в документации, все, что вам нужно сделать, это включить атрибут multiViewState в DataTable.

<p:dataTable id="tableStateTable" value="#{view.items}" var="item" 
             multiViewState="true">
    ...
</p:dataTable>
...