在我的页面中我有:
<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。
答案 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需要两个查询,一个查询返回一个页面的结果作为限制,另一个查询知道数据的总大小。