没有计数行的 Primefaces Paginate Lazy DataTable

Primefaces Paginate Lazy DataTable without count row

在我的页面中我有:

                    <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));
                    }

我的问题是如何根据结果 (size+1) 设置行计数。我不想从数据库中获取计数,因为我确定我们可以在不请求数据库的情况下计算行数。

好的,我明白了。 首先在你的页面中你需要这个:

                    <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>

在您的 bean 中更改加载方法,如下所示:

                            @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 分页 Lazy DataTable 需要两个查询,一个查询以 return 页面的结果作为限制,另一个查询以了解数据的总大小。

PrimeFaces 不支持开箱即用。 A fix has been checked in to trunk on Feb 11th 2016, tagged 6.0(所以它至少应该在当前的 6.0RCx 版本中)。我不确定它是否在 Elite 版本 >=5.2.20 或 >=5.3.7(从 2 月 12 日开始)

这不起作用的一个重要原因是您可能在加载方法服务器端执行的更新行计数应用于分页器客户端。但是,由于它 从服务器传输到客户端 ,您可以在每个 ajax 调用的完成时更新它。事实上,这是 patch 的很大一部分(另一部分是从 ajax 响应中读取值)。

在例如ajax 页面事件的 oncomplete 将解决问题:

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();
}

然后您可以在每次调用加载方法时, - 尝试读取 pagesize+1 条记录 - 如果您可以读取 pageSize+1(但仍然 return pageSize 记录),请将计数设置为此 - 如果页面大小或更小,则将计数设置为读取的行数。