Jsf 2 取消行编辑p:datatable不会还原从属SelectOne菜单的数据
Primefaces数据表中的Dependent SelectOne菜单有问题,我没有找到答案。我想其他人也有同样的问题,所以一定有解决办法。发生的情况是,当我编辑数据表中的一行,然后取消编辑时,我对第一个SelectOne菜单所做的任何更改都会保留在备份对象中,并且不会恢复到其原始值。以下是复制的步骤:Jsf 2 取消行编辑p:datatable不会还原从属SelectOne菜单的数据,jsf-2,primefaces,datatable,selectonemenu,Jsf 2,Primefaces,Datatable,Selectonemenu,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”
?我感谢您的帮助。这令人失望,因为它会让用户体验更轻松。我将选择