【问题标题】:Saving p:dataTable selectionMode="multiple" for all different models on same table in same view为同一视图中同一表上的所有不同模型保存 p:dataTable selectionMode="multiple"
【发布时间】:2014-08-23 14:58:35
【问题描述】:

我有一个包含复选框的数据表,我希望当用户选择一个或多个项目时.. 他的选择列表将显示在另一个页面 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}">

【问题讨论】:

    标签: jsf-2 checkbox primefaces


    【解决方案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);
    }
    

    【讨论】:

    • 这只是一个存根。只需执行您在 onCategoryChange 中已经执行的操作(显然是根据所选类别检索产品)
    • 哦!这太棒了 O.o 这正是我所做的(我调用了与 onCategoryChange 中使用的方法完全相同的方法)但正如我所说,一旦我更改了我的 seletOneMenu 值,我就失去了所选项目所有以前的值
    • 为我工作。您是否按照答案中的指示将表格添加到&lt;p:ajax process&gt;
    • 是的,绝对是..但是我改变了一件事..我把我的 managedbean 设置为@SessionScoped,因为我必须将我选择的项目列表发送到另一个 jsf 页面并且使用@ViewScoped 它没有不工作
    • 好的。你最好有条件地渲染视图,但这是一个不同的问题。您可以在下拉列表的更改中保留选择,对吗?我就是这么回答的。
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2018-08-05
    相关资源
    最近更新 更多