Я использую Primefaces с P: DataTable, настроенным для ленивой загрузки с помощью страниц. Вот соответствующая часть моего DataTable: < /p>
styleClass="borderless headerClass tableFixClass"
style="width:99%;margin-left: 10px;margin-top: 2px;"
rowStyleClass="evenoddRowClass return-row" var="formInstance" rowSelectMode="checkbox"
value="#{formInstanceListBean.formInstances}" rowIndexVar="rowIndex"
paginator="true" rows="#{formInstanceListBean.pageSize}"
first="#{formInstanceListBean.currentPageIndex}"
lazy="true" paginatorPosition="bottom" pageLinks="3" sortMode="multiple"
paginatorAlwaysVisible="true" tableStyleClass="formInstanceListTable"
rowsPerPageTemplate="10,15,50,100,{ShowAll|'All'}" selectionPageOnly="true"
rowKey="#{formInstance.id}" widgetVar="formInstanceListVar" rowExpandMode="multiple"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
< /code>
Я заметил проблему при применении фильтра «все» на странице с небольшим количеством строк. Когда я затем меняю фильтр - в частности, фильтр даты - на диапазон дат с большим количеством рядов, отображаемые ряды становятся неверными. Вместо того, чтобы показывать правильные строки для нового диапазона дат, страница продолжает повторять первые два ряда, пока (если на предыдущей странице было 2 строка), общее количество строк соответствует новой диапазоне дат. < /P>
@Override
public List load(
final int first, final int pageSize,
final Map multiSortMeta, final Map filters) {
updateReturnSources = false;
if (criteria.getProduct() == null || CollectionUtils.isEmpty(criteria.getValidFormId())) {
setRowCount(0);
criteria.setReload(false);
return new ArrayList();
}
if (criteria.isReload()) {
criteria.setStartRowIndex(0);
}
criteria.setStartRowIndex(first);
criteria.setPageSize(pageSize);
if (multiSortMeta != null && multiSortMeta.size() > 0) {
List sortMetas = new ArrayList();
for (SortMeta tempSort : multiSortMeta.values()) {
com.lombardrisk.ocelot.core.jdbc.SortMeta sortMeta =
new com.lombardrisk.ocelot.core.jdbc.SortMeta();
sortMeta.setSortField(tempSort.getField());
if (SortOrder.ASCENDING.equals(tempSort.getOrder())) {
sortMeta.setSortOrder(com.lombardrisk.ocelot.core.jdbc.SortOrder.ASC);
} else if (SortOrder.DESCENDING.equals(tempSort.getOrder())) {
sortMeta.setSortOrder(com.lombardrisk.ocelot.core.jdbc.SortOrder.DESC);
}
sortMetas.add(sortMeta);
}
criteria.setMultiSortMeta(sortMetas);
}
saveCriteriaFrom();
PageResult pageResult = null;
try {
pageResult = formInstanceService.getFormInstanceDtosByCriteria(criteria);
if (pageResult.getResultList().size() == 0 && criteria.getStartRowIndex() != 0) {
criteria.setStartRowIndex(0);
saveCriteriaFrom();
pageResult = formInstanceService.getFormInstanceDtosByCriteria(criteria);
}
} catch (EJBException e) {
if (e.getCausedByException() instanceof UserEntityLinkMissingException) {
MessagesUtil.addMessage(
FacesMessage.SEVERITY_ERROR,
"reporter.createformInstance.user.entity.link.missing");
} else {
logger.error("Error when getting return list", e);
throw e;
}
setRowCount(0);
criteria.setReload(false);
return new ArrayList();
}
setRowCount(pageResult.getRowCount().intValue());
criteria.setReload(false);
PrimeFaces.current().executeScript("updateReturnSources()");
//Work Arround for PF Bug
PrimeFaces.current().executeScript("refreshGlobalTooltips()");
return pageResult.getResultList();
}
< /code>
Я внес некоторые изменения в бэкэнд -детали, и теперь результат возвращается правильно в бэкэнд, но дисплей на панели инструментов все еще неверен < /p>
Я попытался использовать код обновления Primefaces, чтобы обновить таблицу, но не работал. Проблема возникает только при использовании всего фильтра
Подробнее здесь: https://stackoverflow.com/questions/796 ... rong-value