Проблемы с таблицей данных Primefaces

Каков метод обновления данных на последующих страницах (вторая страница, третья страница и т. д.) таблицы Primefaces dataTable с помощью метода LazyDataModel?

Кроме того, если я выбираю элемент в dataTable, чтобы просмотреть его детали на другой странице, а затем возвращаюсь к dataTable, используя либо кнопку «Назад» в браузере, либо реализую метод JavaScript history.back(), кажется, что dataTable всегда сбрасывает свою позицию на на первую страницу вместо того, чтобы вернуться на страницу, на которой был пользователь. Как я могу заставить dataTable оставаться на последней просмотренной странице?

Мои коды для ленивой загрузки:

private final class LazyLoader extends LazyDataModel<BookModel>
{
    private static final long serialVersionUID = 1L;

    public LazyLoader(String sort, String category, String operator, String input) {
        setListing(getBookService().getListing(sort, category, operator, input));
    }

    @Override
    public List<BookModel> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
        return getListing();
    }
}

А для метода Submit это:

public String Submit()
{
    sort     = sortBean.getSort();
    category = categoryBean.getCategory();
    operator = operatorBean.getOperator(); 
    input    = searchBean.getInput();

    lazyModel = new LazyLoader(sort, category, operator, input);
    lazyModel.setRowCount(listing.size());

    return null;
} 

Я использую @ViewScoped для вывода списка записей книги, а также для отображения деталей записи книги.

У кого-нибудь есть подобные проблемы с таблицей данных Primefaces?


person ChuongPham    schedule 21.04.2011    source источник


Ответы (3)


Продолжайте использовать @ViewScoped. Вы не должны использовать @SessionScoped, если у вас нет в этом реальной необходимости.

Чтобы запомнить последнюю страницу, вы должны установить атрибут first метода load. Вы можете сделать это с параметрами запроса. Что-то вроде: yourview.xhtml?f=3 .

Что касается обновления, то дело в том, что вы используете ленивый загрузчик, но вы загружаете все сразу... Ваш метод load - это тот, который должен выполнять запрос по запросу, то есть страницу по страницам.

person bluefoot    schedule 22.04.2011
comment
Спасибо за ваш отзыв. Да, @ViewScoped в моем случае более чем достаточно. Хорошо, я попробую метод параметра запроса и просмотрю свой метод LazyLoader. - person ChuongPham; 22.04.2011
comment
После долгих проб и ошибок я решил реализовать свою собственную таблицу данных и навигацию, используя стандартный компонент Mojarra dataTable. Таблица данных Primefaces, похоже, не работает. И, учитывая, что я также предоставил латинскую и нелатинскую поддержку UTF-8 (ввод данных, поиск, сортировка и фильтрация) в своем веб-проекте, лучше всего написать свои собственные методы для управления компонентом dataTable. Можно еще раз взглянуть на Primefaces dataTable, когда выйдет версия 4.x.x - к тому времени все может быть по-другому!... :) - person ChuongPham; 26.04.2011
comment
Использование @ViewScoped решило это для меня. Однако с тех пор я перешел на OmniFaces, так как поддержка и библиотека Java намного лучше, чем PrimeFaces. - person ; 20.06.2015

Работает ли у вас нумерация страниц без ленивой загрузки? Я хотел бы убедиться, что это работает так, как ожидалось, прежде чем переходить к самому сложному случаю.

Если вы хотите, чтобы ваш dataTable помнил последнюю разбивку на страницы после того, как вы ушли со страницы JSF, вам нужно сделать управляемый компонент SessionScoped. Жизненный цикл управляемого компонента ViewScoped заканчивается после того, как навигация покидает представление.

person maple_shaft    schedule 21.04.2011
comment
Кроме того, я добавлю, что для обновления данных в отложенной загрузке dataTable попробуйте создать экземпляр и назначить новую модель LazyLoadDataModel. - person maple_shaft; 21.04.2011
comment
@maple_shaft: я попробовал @SessionScoped, и это не имеет значения — dataTable переходит на первую страницу, как только я нажимаю кнопку «Назад» в браузере или выполняю метод JavaScript history.back(). Я не понимаю вашего второго комментария. - person ChuongPham; 21.04.2011
comment
@maple_shaft: Да, это работает без ленивой загрузки, но у меня все еще есть проблема с возвратом таблицы данных на первую страницу. - person ChuongPham; 21.04.2011
comment
Я говорю, попробуйте создать новый объект LazyDataModel и заменить тот, на который вы ссылаетесь в своем управляемом компоненте. Если это не обновляет данные в вашей таблице, возможно, это проблема с вашим кодом getBookServer getListing. - person maple_shaft; 21.04.2011
comment
@maple_shaft: Вы имеете в виду метод LazyLoader? Как? - person ChuongPham; 21.04.2011
comment
@maple_shaft: Это не вопрос английского языка - это потому, что я не знаю, как это сделать, поэтому я задаю вопрос здесь, в Stackoverflow. Я бы не спрашивал, если бы знал как, не так ли? :) - person ChuongPham; 21.04.2011

Чтобы сохранить выбранную страницу, вам нужно сделать 2 вещи.

Сначала сделайте сеанс управляемого компонента ограниченным.

Во-вторых, установите привязку между datatable и объектом UIData. Например, в вашем бэкэнд-бине поместите

private UIData filasUIData = null;

public UIData getFilasUIData() {
    return filasUIData;
}

public void setFilasUIData(UIData filasUIData) {
    this.filasUIData = filasUIData;
}

Теперь в вашей таблице данных

<ice:dataTable
    binding="#{yourBean.filasUIData}"

это все.

person oviwonkenovi    schedule 07.03.2012