PrimeFaces 数据 table 分页器在第一次延迟加载时不显示
PrimeFaces data table paginator does not show at first lazy load
我正在使用 PrimeFaces 6.0。我正在创建一个使用延迟加载的数据 table。我在 load
方法中设置了 this.setRowCount(count)
。我的分页器显示不正确(它只显示禁用的上一个、下一个、开始、结束按钮)。
当我过滤 table 或更改排序时,分页器显示页面。另外,当我 运行 这个 JavaScript 时,分页器显示页面:
PF('myTable').clearFilters();
关于如何在不应用 hack 的情况下让分页器工作的任何想法?
这是我的table(相关属性):
<p:dataTable value="#{controller.lazy}"
lazy="true"
var="subitem"
rowKey="#{subitem.id}"
paginator="true" paginatorPosition="bottom"
rows="10"
sortBy="#{subitem.emailAddress}" sortOrder="ascending"
widgetVar="myTable"
>
我的懒人模型(相关部分):
public class LazyDataModel<T> extends org.primefaces.model.LazyDataModel<T> {
private final QueryBuilder<T> queryBuilder;
private final Class<T> type;
public LazyDataModel(final QueryBuilder<T> queryBuilder, final Class<T> type) {
this.queryBuilder = queryBuilder;
this.type = type;
}
private void updateRowCount() {
setRowCount(queryBuilder.count().intValue());
}
@Override
public List<T> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
if (filters != null) {
queryBuilder.addFilters(filters);
}
if (multiSortMeta != null) {
multiSortMeta.forEach(s -> queryBuilder.orderBy(s.getSortField(), s.getSortOrder() == SortOrder.ASCENDING));
}
updateRowCount();
TypedQuery<T> typedQuery = queryBuilder.createQuery();
typedQuery.setMaxResults(pageSize);
typedQuery.setFirstResult(first);
return typedQuery.getResultList();
}
@Override
public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
List<SortMeta> multiSortMeta = null;
if (sortField != null && sortOrder != null) {
multiSortMeta = Arrays.asList(new SortMeta(null, sortField, sortOrder, null));
}
return load(first, pageSize, multiSortMeta, filters);
}
}
对于 Lazy 数据表,您需要在 load
方法之外使用 LazyDataModel#setRowCount(int n)
设置行数,即在 bean 初始化期间。
另请参阅:
How to query data for Primefaces dataTable using lazy loading and pagination
我正在使用 PrimeFaces 6.0。我正在创建一个使用延迟加载的数据 table。我在 load
方法中设置了 this.setRowCount(count)
。我的分页器显示不正确(它只显示禁用的上一个、下一个、开始、结束按钮)。
当我过滤 table 或更改排序时,分页器显示页面。另外,当我 运行 这个 JavaScript 时,分页器显示页面:
PF('myTable').clearFilters();
关于如何在不应用 hack 的情况下让分页器工作的任何想法?
这是我的table(相关属性):
<p:dataTable value="#{controller.lazy}"
lazy="true"
var="subitem"
rowKey="#{subitem.id}"
paginator="true" paginatorPosition="bottom"
rows="10"
sortBy="#{subitem.emailAddress}" sortOrder="ascending"
widgetVar="myTable"
>
我的懒人模型(相关部分):
public class LazyDataModel<T> extends org.primefaces.model.LazyDataModel<T> {
private final QueryBuilder<T> queryBuilder;
private final Class<T> type;
public LazyDataModel(final QueryBuilder<T> queryBuilder, final Class<T> type) {
this.queryBuilder = queryBuilder;
this.type = type;
}
private void updateRowCount() {
setRowCount(queryBuilder.count().intValue());
}
@Override
public List<T> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
if (filters != null) {
queryBuilder.addFilters(filters);
}
if (multiSortMeta != null) {
multiSortMeta.forEach(s -> queryBuilder.orderBy(s.getSortField(), s.getSortOrder() == SortOrder.ASCENDING));
}
updateRowCount();
TypedQuery<T> typedQuery = queryBuilder.createQuery();
typedQuery.setMaxResults(pageSize);
typedQuery.setFirstResult(first);
return typedQuery.getResultList();
}
@Override
public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
List<SortMeta> multiSortMeta = null;
if (sortField != null && sortOrder != null) {
multiSortMeta = Arrays.asList(new SortMeta(null, sortField, sortOrder, null));
}
return load(first, pageSize, multiSortMeta, filters);
}
}
对于 Lazy 数据表,您需要在 load
方法之外使用 LazyDataModel#setRowCount(int n)
设置行数,即在 bean 初始化期间。
另请参阅:
How to query data for Primefaces dataTable using lazy loading and pagination