Primefaces ajax没有以相同的形式更新panel或panelGrid组件

时间:2016-01-19 21:23:24

标签: javascript jquery ajax jsf primefaces

我正在尝试编写一个注册新用户的应用程序,并让他们在创建登录详细信息后填写用户配置文件。我需要另一个表单来显示用户输入的确认副本作为验证,之后用户可以在保留配置文件表单之前接受或编辑该条目。

使用以下操作成功创建了用户:

public String makeUser() {

    if (nameAvailable = true) {
        facade.create(newUser);
    } else {
        userMessage = "VALIDAION FAILED. Please try again and check that your uder name is not already taken";
    }

    selUser = newUser;
    return "/Main/Users/UserProfile";
}

然后将用户定向到个人资料表格:

<h:form id="proform">
    <p:outputPanel id="propan">
    <p:panelGrid id="userpro" columns="2">
    <p:outputLabel value="Salutation"/>
    <p:inputText value="#{userBean.salutation}"/>

    <p:outputLabel value="First Name:"/>
    <p:inputText value="#{userBean.proFirstName}"/>

    <p:outputLabel value="Surame:"/>
    <p:inputText value="#{userBean.proSurname}"/>

    <p:outputLabel value="Date of Birth:"/>
    <p:calendar value="#{userBean.dateofbirth}"/>


    </p:panelGrid>
    <p:commandLink id="make" value="Create"
    action="#{userBean.checkProfile}"
    process=":proform:make :proform:userpro"
     update="proform:usercheck"/>

//  also tried 
     process="userpro"
     update="usercheck"/>

以下checkProfile操作用于创建验证表单,供用户检查其输入(但似乎没有执行):

public void checkProfile() {
    newPro = new Enprofile(salutation, proFirstName, proSurname, dateofbirth, selUser);

    salutation = getSalutation();
    newPro.setSaltuation(salutation);

    proFirstName = getProFirstName();
    newPro.setFirstname(proFirstName);

    proSurname = getProSurname();
    newPro.setSurname(proSurname);

    dateofbirth = getDateofbirth();
    newPro.setDateofbirth(dateofbirth);

    selUser = getSelUser();
    newPro.setUser(selUser);

    System.out.println("New Profile First Name" + newPro.getFirstname());
    setNewPro(newPro);


}

用户检查表格是:

    <p:panelGrid id="usercheck" columns="2"> 
    <p:outputLabel value="#{userBean.newPro.saltuation}"/>
    <p:outputLabel value="#{userBean.newPro.firstname}"/>
     <p:outputLabel value="#{userBean.newPro.surname}"/>
    <p:outputLabel value="#{userBean.newPro.dateofbirth}"/>
     <p:commandLink id="accept" value="Accept"
    action="#{userBean.makeProfile}" 
    ajax="false"/>
    </p:panelGrid>
</h:form>

从配置文件表单(id:proform)调用checkProfile操作时,usercheck表单保持空白,控制台不显示任何错误消息。

阅读PF文档和这里的问题,我知道Ajax API包含三个基本功能

PrimeFaces.ajax.Request.handle(cfg);
PrimeFaces.ajax.Response

由于控制台是完全空白的,它会表明ajax请求首先没有被触发,这导致我认为我在checkProfile操作的过程部分做错了什么? /强>

更新:

回应BalusC的评论,请注意我已经完成了以下问题中的所有要点(标记为重复):

commandButton/commandLink/ajax action/listener method not invoked or input value not updated

具体来说我已经调整了第8点

  

如果您使用的是Ajax,请确保使用UIInput和UICommand   感兴趣的组件由<f:ajax execute>或例如<p:commandXxx process>涵盖。   <p:commandLink id="make" value="Create" action="#{userBean.checkProfile}" process=":proform:make :proform:userpro" update=":proform:usercheck"/> ,否则将无法执行/处理。   另请参阅了解PrimeFaces的过程和更新属性。

System.out.println("New Profile First Name" + newPro.getFirstname());

如上所述我认为我已经在流程执行中包含了UIInput和UICommand,但仍然没有运气。控制台甚至不会在checkProfile方法中打印新创建的实例的确认值:

  <p:messages id="msg" for="make" 
  showDetail="true" 
  autoUpdate="true"/>

关于问题中的其他要点:

  • 1)UICommand和UIINput组件位于h:form标签
  • 2)多个UIForm组件似乎没有嵌套
  • 3)似乎没有发生任何输入验证错误 以下消息标记显示为空白:

    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.get(ArrayList.java:382)
    at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165)
    at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1607)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy$2.visit(FaceletPartialStateManagementStrategy.java:380)
    at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1689)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreView(FaceletPartialStateManagementStrategy.java:367)
    
  • 4)组件不在任何迭代标记内

  • 5)没有为任何明确指定渲染属性 组件**(我假设没有明确指定渲染属性默认值为true ??)**

  • 6)没有为UIInput操作(或页面上的任何其他内容)记录JS错误
  • 7)主模板中有一个h:head
  • 8)感兴趣的UICommand和UIInput组件都在 包含在commandLink
  • 的ajax进程中
  • 9)页面上只有一个表单(在最近的编辑之后)
  • 10)表单不包含enctype =“multipart / form-data
  • 11)我在commandLink

  • 中使用常规操作标记
  • 12)没有调用FacesContext#renderResponse()或
    FacesContext #responseComplete()似乎是由任何发生的 事件监听器

  • 13)同一请求 - 响应链中没有过滤器或Servlet 阻止FacesServlet的请求

在最后一点(13),请求 - 响应链可能已中断(未阻止)FacesServlet请求。如果我在checkProfile操作中将ajax值设置为false,则会生成以下堆栈:

{{1}}

这表明恢复视图状态存在问题,因为以前在创建用户时呈现了页面。我是否需要刷新View状态?

我建议这个问题不重复,错误可能比欺骗中提到的13分更多?感谢

0 个答案:

没有答案