問題は、最初のページでいくつかの項目を選択した後、別のページにページを戻して戻ってくると、私の初期選択が表示されません。私はSelectableDataModel
と同様にrowKey
属性を実装しようとしましたが、問題は解決しません。p:LazyDataModelを改ページした後にdataTableの選択が失われる
これは私のテスト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
}
これは私のテストページです:
<?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>
あなたは私がここで間違って何をやったか私を見ることができれば、私は非常に感謝されると思います。
UPDATE:コンソールで
- 、私はページ付けするたびに、
TEST 1: getRowData
常にTEST 2: load
前に印刷されています。私は上記のコードに多くのSystem.out.println("TEST")
を追加した後は、私は次のことを観察しました。その結果、方法#LazyDataModel.getWrappedData()
は古いページからデータを返す可能性があります。最初は、このメソッドの目的は、テーブル上で強調表示するために選択した行を取得することだと思いました。しかし、このメソッドがload
の前に呼び出されていれば、それは仕事を正しく行う方法はありませんか? - 最初のページで2番目の項目を選択した後、コンソールで
TEST 3: chosenItems's size: 2
が表示されました。 2ページ目に改ページしてから1ページ目に戻った場合は、前述のように選択が失われます。しかし、別のアイテムを選択し続けると、コンソールでTEST 3: chosenItems's size: 3
が表示されました。明らかに、chosenItems
のリストはまだ私の古い選択を保持しましたが、テーブルには表示されません。
+1シンプルでテスト可能なSSCCEを提供します;-)次回Copy'paste'runにするために 'Item'サブクラスを追加することを検討してください –
具体的な問題についてはわかりません。あなたのbeanはビュースコープですが、確かにページに戻ったときにすべてのプロパティをデフォルトに設定して再作成する必要がありますか?同じビューを操作する場合は、別のビューに移動するのではなく、同じビューで結果を条件付きでレンダリングすることを検討する必要があります。 – BalusC
@BalusC私は彼が他のページに移動することについて話すとき、彼は実際にはビューの代わりにテーブルページ(ページング)を意味すると考えています。 –