我正在尝试使用PrimeFaces数据表的Rowinator,但我遇到了更改数据表中的值的问题,托管bean无法识别新值,而旧值仍然存在。
我几乎"克隆"了RowEditing的展示,但令人惊讶的是,我没有工作。我搜索了更多的帖子,有些人说这可能是一个错误,但我完全复制了展示的例子,它确实有效。我的版本是PrimeFaces 5.0。
*.xhtml
<h:form id="frmExclos">
<p:growl id="mensajeGeneral3" sticky="false" showDetail="true"/>
<p:panel id="pnlCriteriExclusio" style="width: 425px" header="Criteris d'exclusió del pacient" widgetVar="pnlCriterisE">
<p:dataTable id="tblCriterisExclusioNia" var="itemCriterisExclusio" value="#{mbRCriteriExclusio.getCriterisExclusioNia(mbVMalignitatNia.personaAmbMalignitatNia.id)}" editable="true">
<p:ajax event="rowEdit" listener="#{mbRCriteriExclusio.onRowEdit}" update=":frmExclos:mensajeGeneral3" />
<p:ajax event="rowEditCancel" listener="#{mbRCriteriExclusio.onRowCancel}" update=":frmExclos:mensajeGeneral3" />
<p:column headerText="Observacions">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{itemCriterisExclusio.comentaris}"></h:outputText></f:facet>
<f:facet name="input"><p:inputText value="#{itemCriterisExclusio.comentaris}" label="Observacions"></p:inputText></f:facet>
</p:cellEditor>
</p:column>
<p:column style="width:32px">
<p:rowEditor />
</p:column>
<f:facet name="footer" ><p:commandButton update="@this" icon="ui-icon-plusthick" value="Afegir criteri" oncomplete="PF('dlgAddCriterisExclusio').show()"/>
</f:facet>
</p:dataTable>
</p:panel>
</h:form>
然后,托管bean的片段MbRCriteriExclusio.java:
@Named(value = "mbRCriteriExclusio")
@ViewScoped
public class MbRCriteriExclusio {
public void onRowCancel(RowEditEvent event) {
FacesMessage msg = new FacesMessage("Edit Cancelled", "" + ((MalignitatPersonaCriterisExclusioNia) event.getObject()).getComentaris());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
在Msg中,getComentaris返回数据表中加载的初始值,而不是我编辑过的新值!showcase的代码是相同的。。
非常感谢您的帮助
在rowCancel的情况下,它不会反映新值,因为您正在取消更改。在这个函数public void onRowEdit(RowEditEvent事件)中,您将能够获得修改后的值。试试这个。
在RowEditEvent中也会发生同样的事情。
我没有写功能,所以没有太长的消息
msg显示的是初始值,而不是RowEditEvent中更新的值。
假设预期方法类似于:
public void onRowEdit(RowEditEvent event) {
Object o = event.getObject();
persist(o);
}
修复归功于:http://jwsn.blogspot.com/2013/05/issue-with-rowedit-event-in-primefaces.html
如果数据表数据模型由具有数据库查询的getter支持,则可能需要在数据库调用周围进行null检查,以便它只在null时刷新值。这是将event.getObject()中的"new"值覆盖为"old"值。
猜测你的吸气剂是这样的:
listOfX List<X>;
public List<X> getCriterisExclusioNia(idType id) {
listOfX = getFacade().getListofX(id);
return listOfX;
}
这样做:
public List<X> getCriterisExclusioNia(idType id) {
if(listOfX == null) {
listOfX = getFacade().getListofX(id);
}
return listOfX;
}