p:在对LazyDataModel进行分页后,dataTable选择会丢失

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")在上面的代码中添加了更多内容后,我观察到以下内容:

  1. 在控制台上,每次分页时,TEST 1: getRowData始终打印TEST 2: load.因此,我相信该方法#LazyDataModel.getWrappedData()可能会从旧页面返回数据.起初,我认为这个方法的目标是检索选定的行以突出显示在表上.但是,如果以前调用此方法load,那么它无法正常工作吗?
  2. 在我选择了第一页上的前2项后,在控制台上,我看到了TEST 3: chosenItems's size: 2.如果我分页到第二页然后回到第一页,则选择将丢失,如上所述.但是,如果我继续在控制台上选择另一个项目,我看到了TEST 3: chosenItems's size: 3.显然,该chosenItems列表仍然保留了我的旧选择,但它们没有呈现在桌面上.

Ber*_* G. -1

我的数据表也有同样的问题。尽管我的情况有点不同,因为我使用的是selectBooleanCheckbox。我找到了一个适合我的简单解决方案。当你说“旧的选择没有呈现在表格中”时,我很震惊。

  • 使用a4j:support 事件绑定复选框

代码:

<h:selectBooleanCheckbox value="#{batch.toPortfolio}">
    <a4j:support event="onchange" />
</h:selectBooleanCheckbox>
Run Code Online (Sandbox Code Playgroud)