Jsf 2 取消行编辑p:datatable不会还原从属SelectOne菜单的数据

Jsf 2 取消行编辑p:datatable不会还原从属SelectOne菜单的数据,jsf-2,primefaces,datatable,selectonemenu,Jsf 2,Primefaces,Datatable,Selectonemenu,Primefaces数据表中的Dependent SelectOne菜单有问题,我没有找到答案。我想其他人也有同样的问题,所以一定有解决办法。发生的情况是,当我编辑数据表中的一行,然后取消编辑时,我对第一个SelectOne菜单所做的任何更改都会保留在备份对象中,并且不会恢复到其原始值。以下是复制的步骤: 打开一行进行编辑 更改第一列中的值(您可以验证第二列列表是否已更改) 取消行编辑 第一列值不会恢复为原始值 我认为这与对支持bean的监听器的ajax调用有关。这就像是发布了值。这是不可取的行

Primefaces数据表中的Dependent SelectOne菜单有问题,我没有找到答案。我想其他人也有同样的问题,所以一定有解决办法。发生的情况是,当我编辑数据表中的一行,然后取消编辑时,我对第一个SelectOne菜单所做的任何更改都会保留在备份对象中,并且不会恢复到其原始值。以下是复制的步骤:

  • 打开一行进行编辑
  • 更改第一列中的值(您可以验证第二列列表是否已更改)
  • 取消行编辑
  • 第一列值不会恢复为原始值
  • 我认为这与对支持bean的监听器的ajax调用有关。这就像是发布了值。这是不可取的行为。是否有解决方案

    我将代码示例包括在下面:

    <html xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui">  
    
    <f:view contentType="text/html">
    <h:head>  
        <title>
            <ui:insert name="title">Example One</ui:insert>
        </title>
    </h:head>  
    
    <h:body>
        <h:form id="form">
            <p:growl id="msgs" showDetail="true"/>
            <p:messages/>
            <p:dataTable id="editTable" var="item" value="#{exampleOne.items}" editable="true" scrollable="false" scrollHeight="350" rowIndexVar="rowIndex">
                <p:ajax event="rowEdit" listener="#{exampleOne.onRowEdit}" update=":form:msgs" />
                <p:ajax event="rowEditCancel" listener="#{exampleOne.onRowCancel}" update=":form:msgs" />
                <p:ajax event="rowEditInit" listener="#{exampleOne.onRowInit}" />
    
                <p:column headerText="Name" style="width: 100px;">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{item.name}"/></f:facet>
                        <f:facet name="input"><p:inputText id="tagId" value="#{item.name}" style="width:100%"/></f:facet>
                    </p:cellEditor>
                </p:column>
    
                <p:column headerText="Column One" style="width: 200px;">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{item.columnOneValue}"/></f:facet>
                        <f:facet name="input">
                            <p:selectOneMenu id="columnOneId" value="#{item.columnOneValue}" style="width:100%">
                                <p:ajax event="change" listener="#{exampleOne.onColumnOneChange}" update="columnTwoId" />
                                <f:selectItem itemLabel="Select Column One" itemValue="" noSelectionOption="true" />
                                <f:selectItems value="#{exampleOne.columnOneSelectItems}" var="columnOneSelectItem" itemLabel="#{columnOneSelectItem}" itemValue="#{columnOneSelectItem}"/>
                            </p:selectOneMenu>
                        </f:facet>
                    </p:cellEditor>
                </p:column>
    
                <p:column headerText="Column Two" style="width: 125px;">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{item.columnTwoValue}"/></f:facet>
                        <f:facet name="input">
                            <p:selectOneMenu id="columnTwoId" value="#{item.columnTwoValue}" style="width:100%">
                                <f:selectItem itemLabel="Select Column Two" itemValue="" noSelectionOption="true" />
                                <f:selectItems value="#{exampleOne.columnTwoSelectItems}" var="columnTwoSelectItem" itemLabel="#{columnTwoSelectItem}" itemValue="#{columnTwoSelectItem}"/>
                            </p:selectOneMenu>
                        </f:facet>
                    </p:cellEditor>
                </p:column>
    
                <p:column headerText="Edit" style="width: 75px;">
                    <p:rowEditor />
                </p:column>
    
    
            </p:dataTable>
        </h:form>
    </h:body>
    </f:view>
    </html>  
    
    package com.windhaven_consulting.breezy.controller.ui;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.annotation.PostConstruct;
    import javax.faces.application.FacesMessage;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.component.UIOutput;
    import javax.faces.context.FacesContext;
    import javax.faces.event.AjaxBehaviorEvent;
    
    import org.apache.commons.lang3.StringUtils;
    import org.primefaces.event.RowEditEvent;
    
    import com.windhaven_consulting.breezy.component.MountedBoard;
    
    @ManagedBean
    @SessionScoped
    public class ExampleOne implements Serializable {
    
    private List<Item> items = new ArrayList<Item>();
    
    private List<String> columnOneSelectItems = new ArrayList<String>();
    
    private Map<String, List<String>> columnOneToColumnTwoMap = new HashMap<String, List<String>>();
    
    private List<String> columnTwoSelectItems;
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    @PostConstruct
    public void postConstruct() {
        items.add(new Item("item 1", "Select One", "Select One A"));
        items.add(new Item("item 2", "Select Two", "Select Two A"));
        items.add(new Item("item 3", "Select Three", "Select Three A"));
    
        columnOneSelectItems.add("Select One");
        columnOneSelectItems.add("Select Two");
        columnOneSelectItems.add("Select Three");
    
        List<String> columnTwoSelectItems = new ArrayList<String>();
        columnTwoSelectItems.add("Select One One");
        columnTwoSelectItems.add("Select One Two");
        columnTwoSelectItems.add("Select One Three");
        columnOneToColumnTwoMap.put("Select One", columnTwoSelectItems);
    
        columnTwoSelectItems = new ArrayList<String>();
        columnTwoSelectItems.add("Select Two One");
        columnTwoSelectItems.add("Select Two Two");
        columnTwoSelectItems.add("Select Two Three");
        columnOneToColumnTwoMap.put("Select Two", columnTwoSelectItems);
    
        columnTwoSelectItems = new ArrayList<String>();
        columnTwoSelectItems.add("Select Three One");
        columnTwoSelectItems.add("Select Three Two");
        columnTwoSelectItems.add("Select Three Three");
        columnOneToColumnTwoMap.put("Select Three", columnTwoSelectItems);
    }
    
    public void onRowInit(RowEditEvent event) {
    }
    
    public void onRowEdit(RowEditEvent event) {
    }
    
    public void onRowCancel(RowEditEvent event) {
    }
    
    public void onColumnOneChange(final AjaxBehaviorEvent event) {
        String selectedValue = (String) ((UIOutput) event.getSource()).getValue();
    
        if(StringUtils.isNotEmpty(selectedValue)) {
            columnTwoSelectItems = columnOneToColumnTwoMap.get(selectedValue);
        }
        else {
            columnTwoSelectItems = Collections.emptyList();
        }
    }
    
    public List<Item> getItems() {
        return items;
    }
    
    public List<String> getColumnOneSelectItems() {
        return columnOneSelectItems;
    }
    
    public List<String> getColumnTwoSelectItems() {
        return columnTwoSelectItems;
    }
    }
    
    
    例一
    包com.windhaven_consulting.breezy.controller.ui;
    导入java.io.Serializable;
    导入java.util.ArrayList;
    导入java.util.Collections;
    导入java.util.HashMap;
    导入java.util.List;
    导入java.util.Map;
    导入javax.annotation.PostConstruct;
    导入javax.faces.application.FacesMessage;
    导入javax.faces.bean.ManagedBean;
    导入javax.faces.bean.SessionScoped;
    导入javax.faces.component.UIOutput;
    导入javax.faces.context.FacesContext;
    导入javax.faces.event.AjaxBehaviorEvent;
    导入org.apache.commons.lang3.StringUtils;
    导入org.primefaces.event.RowEditEvent;
    导入com.windhaven_consulting.breezy.component.MountedBoard;
    @ManagedBean
    @会议范围
    公共类ExampleOne实现了可序列化{
    私有列表项=新的ArrayList();
    private List columnOneSelectItems=new ArrayList();
    私有映射columneToColumnTwoMap=新HashMap();
    私有列表列选择项;
    /**
    * 
    */
    私有静态最终长serialVersionUID=1L;
    @施工后
    施工后公共空间(){
    添加(新项目(“项目1”、“选择一个”、“选择一个”));
    添加(新项目(“项目2”、“选择两个”、“选择两个A”);
    项目。添加(新项目(“项目3”、“选择三个”、“选择三个A”);
    columnOneSelectItems.add(“选择一项”);
    columnOneSelectItems.add(“选择两个”);
    columnOneSelectItems.add(“选择三项”);
    List columnTwoSelectItems=new ArrayList();
    columnTwoSelectItems.add(“selectone”);
    columnTwoSelectItems.add(“selectone-Two”);
    columnTwoSelectItems.add(“selectone-Three”);
    columnOneToColumnTwoMap.put(“选择一个”,columnTwoSelectItems);
    columnTwoSelectItems=新建ArrayList();
    columnTwoSelectItems.add(“selecttwone”);
    columnTwoSelectItems.add(“selecttwo”);
    columnTwoSelectItems.add(“selecttwoothree”);
    columnOneToColumnTwoMap.put(“选择两个”,columnTwoSelectItems);
    columnTwoSelectItems=新建ArrayList();
    columnTwoSelectItems.add(“选择三个一”);
    columnTwoSelectItems.add(“选择三个和两个”);
    columnTwoSelectItems.add(“选择三个三个”);
    columnOneToColumnTwoMap.put(“选择三个”,columnTwoSelectItems);
    }
    公共void onRowInit(RowEditEvent事件){
    }
    公共无效onRowEdit(RowEditEvent事件){
    }
    公共作废onRowCancel(RowEditEvent事件){
    }
    ColumnOneChange的公共无效(最终AjaxBehaviorEvent事件){
    String selectedValue=(String)((UIOutput)event.getSource()).getValue();
    if(StringUtils.isNotEmpty(selectedValue)){
    columnTwoSelectItems=columnOneToColumnTwoMap.get(selectedValue);
    }
    否则{
    columnTwoSelectItems=Collections.emptyList();
    }
    }
    公共列表getItems(){
    退货项目;
    }
    公共列表getColumnOneSelectItems(){
    returncolumneselectitems;
    }
    公共列表getColumnTwoSelectItems(){
    返回所选项目;
    }
    }
    
    尝试将
    process='@this'
    添加到ajax处理程序。下一次,请将示例代码变得更简单…只是尝试了一下,行为没有变化。顺便问一下,有没有真正好的资源提供详细的示例?这是我确信很久以前已经解决的常见功能。cellEditor and ROWDEDITOR不是最常用的。我从不使用它。总是在对话框中更新/编辑数据,甚至是在一个全新的页面中。使用此功能会遇到很多麻烦。尝试使用
    process=“@none”
    ?非常感谢您的帮助。这让人失望,因为这会让用户体验更轻松。我会选择一个对话框来完成这项工作。干杯这也不起作用。我的第二个SelectOne菜单没有更新。对话是!尝试将
    进程='@This'
    添加到ajax处理程序中。下次,请编写示例代码更简单的是…只是尝试了一下,行为没有改变。顺便说一句,有没有真正好的资源和详细的例子?这是我确信很久以前已经解决的常见功能。cellEditor和rowEditor不是最常用的。我从来没有使用过。总是在对话框中更新/编辑数据,甚至一个全新的页面。使用此功能会带来很多麻烦。尝试使用
    process=“@none”
    ?我感谢您的帮助。这令人失望,因为它会让用户体验更轻松。我将选择