1

在我的页面中,我有:

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

我的问题是如何从结果(大小+1)中设置行计数。我不想从 DB 中获取计数,因为我确信我们可以在不请求 DB 的情况下计算 rowCount。

4

3 回答 3

2

PrimeFaces 不支持这个开箱即用。已于 2016 年 2 月 11 日将修复签入到主干,标记为 6.0(因此它至少应该在当前的 6.0RCx 版本中)。我不确定它是否在 Elite 版本中 >=5.2.20 或 >=5.3.7(从 2 月 12 日开始)

这不起作用的一个重要原因是您可能在加载方法服务器端执行的更新 rowCount应用于分页器客户端。但是,由于它是从服务器传输到客户端的,因此您可以在每个 ajax 调用的 oncomplete 中对其进行更新。事实上,这是补丁的很大一部分(另一部分是从 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();
}

然后,您可以在 load 方法中的每个调用中, - 尝试读取 pagesize+1 记录 - 如果您可以读取 pageSize+1(但仍返回 pageSize 记录),请将计数设置为此 - 将计数设置为读取的行数,如果它们是 pageSize 或更少。

于 2016-05-12T16:35:15.440 回答
-1

Primefaces 分页 Lazy DataTable 需要两个查询,一个查询返回一个页面作为限制的结果,另一个查询知道数据的总大小。

于 2016-05-12T14:17:10.703 回答
-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;
                            }
于 2016-05-12T13:34:12.740 回答