在表格上我有一些个人信息(姓名,地址等)和一个changeListener,它根据性别和姓氏更新称呼和致敬。如果底层实体已经存储在数据库中,它可以正常工作。如果我输入新(未保存)条目的数据,则在调用侦听器后重置表单。输入的所有数据都丢失了,只保留了我在听众和性别中修改的称呼,字母变换,我使用的姓名和附加ajax呼叫。
这是表格的一部分:
<h:form id="person">
<p:panel header="#{msg['prs']}">
<h:panelGrid columns="6" cellpadding="4">
<h:outputText value="#{msg['prs.salutation']}"/>
<p:inputText value="#{personBean.selectedPerson.salutation}"/>
<h:outputText value="#{msg['prs.lettersalutation']}"/>
<p:inputText value="#{personBean.selectedPerson.letterSalutation}"/>
<p:spacer/><p:spacer/>
<h:outputText value="#{msg['prs.name']}: "/>
<p:inputText value="#{personBean.selectedPerson.name}">
<p:ajax event="change" update="person"
listener="#{personBean.selectedPerson.updateSalutation}" />
</p:inputText>
<h:outputText value="#{msg['prs.surname']}: "/>
<p:inputText value="#{personBean.selectedPerson.surname}"/>
<h:outputText value="#{msg['prs.gender']}: "/>
<p:selectOneMenu value="#{personBean.selectedPerson.gender}">
<f:selectItems value="#{enumHelper.getEnum('Gender')}"/>
<p:ajax event="change" update="person"
listener="#{personBean.selectedPerson.updateSalutation}" />
</p:selectOneMenu>
</p:panel>
</h:form>
在代码中我做了更新。
public void updateSalutation() {
// simplified
letterSalutation = "...";
salutation = "...";
// outputs for debug
System.out.println(this.getName()); // --> not null
System.out.println(this.getSurname()); // --> null
}
这个调用中的姓氏,即使在那里输入了数据,也没有附加到ajax调用。所有其他领域也是如此。在我的应用程序中,我使用的是Primefaces,JavaEE 1.6和Wildfly。
这种行为的原因是什么?我可以通过电话改变什么来防止这种情况发生?
答案 0 :(得分:14)
为什么在使用Primefaces
进行ajax更新后字段会重置
此问题有两个可能的原因,具体取决于具体的功能要求:
这是因为您没有告诉JSF处理所需的输入值。
或者,因为您告诉JSF也更新了不需要的输入值。
解决方案取决于原因:
将process="person"
(或process="@form"
)添加到<p:ajax>
以处理整个表单。
或者,修改update="person"
以指定仅真正需要更新的组件。
鉴于您在问题的最后提出了投诉,我相信您正在寻找#1。
答案 1 :(得分:0)
我的解决方案: 在
中包含我要更新的内容<p:panel id="toUpdate">
并制作
update="toUpdate"