Mr.*_*mes 17 datatable pagination lazy-loading primefaces jsf-2
我的问题是,在我在第一页上选择了几个项目后,如果我分页到另一个页面并返回,我的初始选择不会显示.我试图实现SelectableDataModel以及使用rowKey属性,但问题仍然存在.
这是我的测试bean:
@ManagedBean
@ViewScoped
public class MrBean {
private List<Item> chosenItems;
private LazyDataModel lazyModel;
@PostConstruct
public void prepareTest() {
this.lazyModel = new LazyItemDataModel();
}
public void countItems() {
System.out.println("TEST 3: chosenItems's size: " + chosenItems.size());
}
private class LazyItemDataModel extends LazyDataModel<Item> implements SelectableDataModel<Item> {
@Override
public Item getRowData(String rowKey) {
System.out.println("TEST 1: getRowData");
Iterator<Item> iter = ((List<Item>) this.getWrappedData()).iterator();
while (iter.hasNext()) {
Item item = iter.next();
if (item.getId().equals(rowKey)) {
return item;
}
}
return null;
}
@Override
public Object getRowKey(Item item) {
return item.getId();
}
@Override
public List<Item> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
System.out.println("TEST 2: load");
// Code to retrieve items from database
}
}
// Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试页面:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Test page</title>
</h:head>
<h:body>
<h:form>
<p:dataTable id="itemTable" var="item" value="#{mrBean.items}" rows="5"
paginator="true" selection="#{mrBean.chosenItems}" lazy="true" >
<p:ajax event="rowSelectCheckbox" listener="mrBean.countItems" />
<p:column selectionMode="multiple" />
<p:column headerText="ID">
<h:outputText value="#{item.id}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{item.name}" />
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果你能告诉我这里我做错了什么,我将非常感激.
更新:我System.out.println("TEST")在上面的代码中添加了更多内容后,我观察到以下内容:
TEST 1: getRowData始终打印TEST 2: load.因此,我相信该方法#LazyDataModel.getWrappedData()可能会从旧页面返回数据.起初,我认为这个方法的目标是检索选定的行以突出显示在表上.但是,如果以前调用此方法load,那么它无法正常工作吗?TEST 3: chosenItems's size: 2.如果我分页到第二页然后回到第一页,则选择将丢失,如上所述.但是,如果我继续在控制台上选择另一个项目,我看到了TEST 3: chosenItems's size: 3.显然,该chosenItems列表仍然保留了我的旧选择,但它们没有呈现在桌面上.Ber*_* G. -1
我的数据表也有同样的问题。尽管我的情况有点不同,因为我使用的是selectBooleanCheckbox。我找到了一个适合我的简单解决方案。当你说“旧的选择没有呈现在表格中”时,我很震惊。
代码:
<h:selectBooleanCheckbox value="#{batch.toPortfolio}">
<a4j:support event="onchange" />
</h:selectBooleanCheckbox>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10468 次 |
| 最近记录: |