Vấn đề của tôi là sau khi tôi đã chọn một vài mục trên trang đầu tiên, nếu tôi phân trang đến một trang khác và quay trở lại, lựa chọn ban đầu của tôi không được hiển thị. Tôi đã cố gắng để thực hiện các SelectableDataModel
cũng như sử dụng các rowKey
thuộc tính nhưng vấn đề vẫn tồn tại.p: các lựa chọn dataTable bị mất sau khi phân trang một LazyDataModel
Đây là đậu thử nghiệm của tôi:
@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
}
Đây là trang thử nghiệm của tôi:
<?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>
Tôi sẽ rất biết ơn nếu bạn có thể chỉ cho tôi những gì tôi đã làm sai ở đây.
UPDATE: Sau khi tôi thêm nhiều System.out.println("TEST")
vào mã ở trên, tôi đã quan sát những điều sau đây:
- Trên giao diện điều khiển, mỗi khi tôi đánh số trang,
TEST 1: getRowData
luôn in trướcTEST 2: load
. Kết quả là tôi tin phương thức#LazyDataModel.getWrappedData()
có thể trả về dữ liệu từ trang cũ. Lúc đầu, tôi nghĩ mục tiêu của phương pháp này là lấy các hàng đã chọn để tô sáng trên bàn. Tuy nhiên, nếu phương pháp này được gọi trướcload
, không có cách nào nó có thể thực hiện công việc đúng không? - Sau khi tôi chọn 2 mục đầu tiên trên trang đầu tiên, trên bảng điều khiển, tôi đã thấy
TEST 3: chosenItems's size: 2
. Nếu tôi phân trang đến trang thứ 2 và sau đó quay lại trang thứ nhất, các lựa chọn sẽ bị mất như đã đề cập. Tuy nhiên, nếu tôi tiếp tục chọn một mục khác, trên bảng điều khiển, tôi thấyTEST 3: chosenItems's size: 3
. Rõ ràng, danh sáchchosenItems
vẫn giữ các lựa chọn cũ của tôi nhưng chúng không được hiển thị trên bảng.
+1 để cung cấp một SSCCE đơn giản và có thể kiểm tra ;-) Thời gian tới xem xét việc thêm một phân lớp 'Item' để làm cho nó copy'paste'run –
Tôi không chắc chắn về vấn đề cụ thể. Đậu của bạn được xem scoped, chắc chắn nó sẽ được tái tạo với tất cả các thuộc tính của nó thiết lập để mặc định khi bạn truy cập lại trang? Nếu bạn muốn tương tác với cùng một chế độ xem, thì bạn nên xem xét hiển thị kết quả có điều kiện trong cùng một chế độ xem thay vì chuyển sang chế độ xem khác. – BalusC
@BalusC Tôi nghĩ rằng khi anh ấy nói về việc chuyển sang trang khác, anh ấy thực sự có nghĩa là các trang bảng (paginator) thay vì các khung nhìn. –