使用Primefaces

时间:2015-06-23 09:12:47

标签: ajax jsf-2 primefaces

在表格上我有一些个人信息(姓名,地址等)和一个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。

这种行为的原因是什么?我可以通过电话改变什么来防止这种情况发生?

2 个答案:

答案 0 :(得分:14)

  

为什么在使用Primefaces

进行ajax更新后字段会重置

此问题有两个可能的原因,具体取决于具体的功能要求:

  1. 这是因为您没有告诉JSF处理所需的输入值。

  2. 或者,因为您告诉JSF也更新了不需要的输入值。

  3. 解决方案取决于原因:

    1. process="person"(或process="@form")添加到<p:ajax>以处理整个表单。

    2. 或者,修改update="person"以指定真正需要更新的组件。

    3. 鉴于您在问题的最后提出了投诉,我相信您正在寻找#1。

      另见:

答案 1 :(得分:0)

我的解决方案: 在

中包含我要更新的内容
<p:panel id="toUpdate"> 

并制作

update="toUpdate"