我整个上午都在绞尽脑汁想办法解决这个问题,但就是不行。基本上,我不能通过PrimeFaces从cellledit事件获得新的dataTable值。
这是我的XHTML页面:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:form id="httpPolicyForm">
<p:dataTable id="httpTable" var="row" value="#{httpPolicyBean.rows}" editable="true" editMode="cell">
<f:facet name="header">
HTTP Policy
</f:facet>
<p:ajax event="cellEdit" listener="#{httpPolicyBean.onCellEdit}" update=":httpPolicyForm:httpTable" />
<p:column headerText="Property">
<h:outputText value="#{row.name}" />
</p:column>
<p:column headerText="Value">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{row.value}" /></f:facet>
<f:facet name="input"><p:inputText value="#{row.value}" style="width:100%"/></f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
这是我的even listener方法:
public void onCellEdit(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
printRowValues();
if(newValue != null && !newValue.equals(oldValue)) {
logger.debug("Old: " + oldValue + ", New:" + newValue);
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
方法被调用,但newValue的值始终是旧值。此外,表永远不会用新值更新。但是,如果我再次单击单元格以再次编辑该值,则会拉出新值。我不确定我做错了什么。请帮我想一下。
bean是SessionScoped的
我能够通过执行以下步骤使其工作:
将事件监听器onCellEdit()
函数从HttpPolicyBean类移动到一个名为PolicyViewBean的新类,并使该bean成为ViewScoped。
我注意到在PF演示的例子中。
顺便说一句,我现在正试图弄清楚为什么在HttPolicyBean的getRows()被调用多次,当它的范围是SessionScoped。根据我对SessionScoped的理解,它应该只在会话第一次创建并且列表为空时调用一次。