Primefaces Paginate Lazy DataTable без подсчета строк

На моей странице у меня есть:

                    <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...>
                    <p:ajax event="page" oncomplete="myTable" />
                    ...
                    </p:dataTable>

в моем бобе:

                    ...
                    private LazyDataModel list;
                    ...                     
                    public void search() {
                        list = new LazyDataModel<SomeDTO>() {
                            private static final long serialVersionUID = 1L;
                            List<SomeDTO> result = null;

                            @Override
                            public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {                                    
                                List<SomeDTO> result = service.search(searchedName, first, pageSize);
                                // SOME CODE HERE FOR PAGINATION ?? BUT WHAT
                                return result;
                            }

                        };
                        // HOW TO DELETE THIS EXTRA REQUEST
                        list.setRowCount(service.search(searchedName));
                    }

мой вопрос, как установить RowCount из результата (размер +1). я не хочу получать счет от БД, потому что я уверен, что мы можем вычислить rowCount без запроса БД.

3 ответа

Решение

Ладно, я понял. Сначала на вашей странице вам нужно это:

                    <p:remoteCommand name="updateMyTable" update="#{p:component('myTable')}" process="@this" />
                    <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...>
                    <p:ajax event="page" oncomplete="updateMyTable()" />
                    ...
                    </p:dataTable>

в вашем бине измените метод загрузки следующим образом:

                            @Override
                            public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {                                    
                                List<SomeDTO> result = service.search(searchedName, first, pageSize);
                                if (first <= pageSize) {
                                    this.setRowCount(this.getRowCount() + result.size() + 1);
                                } else if (result != null && result.size() > 0 && (result.size() >= pageSize)) {
                                    this.setRowCount(this.getRowCount() + result.size());
                                }
                                return result;
                            }

PrimeFaces не поддерживает это из коробки. 11 февраля 2016 г. было исправлено исправление транка с тегом 6.0 (поэтому оно должно быть как минимум в текущих выпусках 6.0RCx). Я не уверен, что это в версии Elite >=5.2.20 или>=5.3.7 (от 12 февраля)

Одна из важных причин того, что это не работает, заключается в том, что обновленный rowCount, который вы можете сделать в методе загрузки на стороне сервера, не применяется к клиентской части paginator. Однако, поскольку он передается с сервера на клиент, вы можете обновить его при завершении каждого вызова ajax. Фактически, это большая часть патча (другая часть читает значение из ответа ajax).

Комбинированный вызов этого, например, при завершении события страницы ajax, решит проблему:

function updatePaginator(xhr, status, args) {
    var paginator = PF('DataTableWidgetVar').paginator;
    paginator.cfg.rowCount=args.totalRecords;
    paginator.cfg.pageCount = Math.ceil(value / paginator.cfg/rows)||1;
    paginator.updateUI();
}

Затем вы можете при каждом вызове в методе загрузки: - Попытаться прочитать записи pageize+1 - Установить счетчик на это, если вы можете прочитать pageSize+1 (но все же вернуть записи pageSize) - Установить счетчик на количество строк, прочитанных, если они имеют размер страницы или меньше.

Разбиение на страницы Primefaces Lazy DataTable требует два запроса, запрос на возврат результатов страницы в качестве ограничения и другой запрос для определения общего размера данных.

Другие вопросы по тегам