在没有计数行的情况下,Paginate Lazy DataTable

时间:2016-05-12 13:05:27

标签: primefaces datatable rowcount paginate lazydatamodel

在我的页面中我有:

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:-1)

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

Foo
你的bean中的

改变了这样的加载方法:

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

答案 2 :(得分:-1)

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