我对数据表的单元格编辑模式有问题。
我每行只有一个单元格需要能够编辑。
我可以编辑它,但更改后的值不会显示。虽然,奇怪的是,当我重新编辑同一个单元格时,会显示更改的值。
onChange
调用服务器端 Bean,但旧值和新值都相同。
基于类似于展示的示例,不显示咆哮消息。
这是完整的xhtml
代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- jsf:pagecode language="java" location="/src/main/java/pagecode/ManageIniFile.java" --><!-- /jsf:pagecode -->
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
template="theme/ccd.xhtml">
<ui:define name="body-content">
<center>
<h:form styleClass="form" id="form">
<p:growl id="messages" showDetail="true"/>
<h:panelGrid columns="1" cellpadding="20" width="50%">
<h1 class="title ui-widget-header ui-corner-all">Manage Environments</h1>
<div class="entry">
<p:tabView id="tabView" var="section" value="#{iniFile.sections}">
<p:tab id="sectionTab" title="#{section}">
<p:dataTable var="entry" value="#{iniFile.getEntries(section)}" editable="true" editMode="cell">
<p:ajax event="cellEdit" listener="#{pc_ManageIniFile.onCellEdit}" update=":form:messages" />
<p:column headerText="Entry">
<h:outputText value="#{entry.entry}" />
</p:column>
<p:column headerText="Value">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{entry.value}" /></f:facet>
<f:facet name="input"><p:inputText value="#{entry.value}" style="width:46%" label="Value" /></f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
<h:panelGrid columns="2" width="50%">
<h:commandButton type="submit" value="Add Environment" styleClass="loginButton" id="addSection" />
<h:commandButton type="submit" value="Save Environment" styleClass="loginButton" id="saveFile" />
</h:panelGrid>
</div>
</h:panelGrid>
</h:form>
</center>
</ui:define>
</ui:composition>
具有 onCellEdit() 方法的页面代码 bean 如下所示:
public void onCellEdit(CellEditEvent event)
{
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
System.out.println("oldValue=" + oldValue);
System.out.println("newValue=" + newValue);
if (newValue != null && !newValue.equals(oldValue))
{
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
无论我在编辑什么,oldValue
总是等于newValue
。 :哭:
比我更了解的人可以提供任何建议吗?
一旦此页面正常工作,该应用程序就完成了。
谢谢
-克里斯
作为后续,我尝试了Mojarra 2.2.6和MyFaces 2.2.2以及PF 4和5.0.RC1。相同的结果。我不认为单元格编辑在标签视图中工作。我已经设法使展示示例正常工作,因此我知道单元格编辑适用于 WAS 8.5.5.1 和 MF 2.2.2。
我能够复制该问题,该问题是由PrimeFaces 4.0 CE中发生验证错误时的javascript问题引起的。我升级到使用 4.0.6 UR2(非官方版本)http://primefaces.github.io/
源:https://github.com/primefaces/primefaces/tree/4.0.6-UR2(从源构建)。
似乎该错误已在 ELITE 版本中修复,并在 PrimeFaces 5 中修复,并放入非官方版本 - 我认为它在 4.0.3 中修复了此问题报告:
https://code.google.com/p/primefaces/issues/detail?id=6312
编辑 *在与您讨论并实际进一步研究之后 - 我们确定这是因为您的条目试图是动态的,但没有作为变量存储在页面范围内,所以它没有什么可引用的。
干杯
获取数据模型是问题的一部分,另一个是EL做更多事情的能力让我误入歧途,在这种情况下调用函数。
原始代码是:
<p:dataTable id="envEntries" var="entry" value="#{iniFile.getEntries(section)}" editable="true" editMode="cell" >
虽然这呈现正确,但它是我所有onCellEdit()问题的原因,因为尽管请求映射是正确的(所以我可以自己捏造它 - 但这不是重点)JSF找不到允许正确的onCellEdit()操作的值。
工作代码是:
<p:dataTable id="envEntries" var="entry" value="#{iniFile.entries}" editable="true" editMode="cell">
因此,我必须以一种允许它与 JSF 一起工作的方式维护数据模型。
完成所有这些操作后,该应用程序将按预期工作。
-克里斯