保存p:dataTable selectionMode =" multiple"对于同一视图中同一表上的所有不同模型

时间:2014-08-23 14:58:35

标签: jsf-2 checkbox primefaces

我有一个包含复选框的数据表,我希望当用户选择一个或多个项目时...他的选择列表将显示在另一个页面中jsf

我有一个selectOneMenu,允许用户选择一个类别(数据表中填充了此类别的产品)..用户可以从此表中选择一个或多个产品。选项列表显示在另一个jsf页面中.. 我希望用户可以从类别1中选择项目,并从另一个类别(2或3 ...)添加到此列表文章。我的问题是,一旦用户切换到另一个类别(在selectOneMenu中),选择列表没有记录,如果它进入确认页面..选择列表只包含最后选择的项目。有人可以告诉我如何保存chackbox选项,即使用户选择另一个类别?

代码在我之前的问题中可见:checkbox in datatble using primefaces5


这是我在jsf中所做的改变..但是我的问题仍然存在..你可以帮助我找到我的代码中的错误(因为即使@BalusC已经慷慨地向我提供了上述解决方案,这看起来很合乎逻辑我不知道我的错误在哪里)任何指导都将不胜感激。谢谢你提前:)

    <p:selectOneMenu id="category" value="#{catBean.category}" valueChangeListener="#{catBean.changeCategory}" var="line" style="width:150px">
       <p:ajax listener="#{catBean.onCategoryChange}" update="product" />
       <p:ajax process="product" listener="#{catBean.updateProducts}" update="product" />
            <f:selectItem itemLabel="Select Category" itemValue="" noSelectionOption="true" />
            <f:selectItems value="#{catBean.myItems}"  />  
      </p:selectOneMenu>

        <p:outputLabel for="product" value="" />
        <p:dataTable id="product" var="line" value="#{catBean.myProducts}" selection="#{catBean.selectedItems}" style="margin-bottom:0" rowKey="#{line.cdProduct}">

1 个答案:

答案 0 :(得分:1)

在更改下拉列表时,也要处理数据表,通过valueChangeListener记住以前的选择,将当前选择复制到Map并从ajax监听器中恢复新选择方法:

<p:selectOneMenu value="#{bean.category}" valueChangeListener="#{bean.changeCategory}">
    ...
    <p:ajax process="@this products" listener="#{bean.updateProducts}" update="products" />
</p:selectOneMenu>

<p:dataTable id="products" value="#{bean.products}" selection="#{bean.selection}" ...>
    ...
</p:dataTable>

使用

private String category;
private String previousCategory;
private List<Product> products;
private List<Product> selection;
private Map<String, List<Product>> selections = new HashMap<>();

public void changeCategory(ValueChangeEvent event) {
    previousCategory = (String) event.getOldValue();
}

public void updateProducts() {
    selections.put(previousCategory, selection);
    products = productService.find(category);
    selection = selections.get(category);
}