在更改之前,部分页面渲染(primefaces)需要两次单击

时间:2014-11-26 19:30:49

标签: java jsf primefaces

我试图将this答案应用于渲染我的主要页面的一部分,但问题是我需要点击两次才能更改部件才有解决方案吗?

这是我的代码

的index.xhtml

 <html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:ui="http://java.sun.com/jsf/facelets">
 <h:head>
 </h:head>
  <h:body>
    <h:panelGroup id="header" layout="block">
        <h1>Header</h1>
    </h:panelGroup>
    <h:panelGroup id="menu" layout="block">
        <h:form>
            <f:ajax render=":content">
                <p:commandButton value="next" action="#{navBean.next}" />            
                <p:commandButton value="back" action="#{navBean.back}" />
            </f:ajax>
        </h:form>
    </h:panelGroup>
    <h:panelGroup id="content" layout="block">
        <h:panelGroup rendered="#{navBean.activePage == 'firstAjax'}">
            <ui:include src="firstAjax.xhtml" />
        </h:panelGroup>
        <h:panelGroup rendered="#{navBean.activePage == 'lastAjax'}">
            <ui:include src="lastAjax.xhtml" />
        </h:panelGroup>
    </h:panelGroup>
   </h:body>
  </html>

这是我的managedBean

 package com.project.beans;

 import javax.faces.bean.ManagedBean;
 import javax.faces.bean.SessionScoped;

 @ManagedBean(name = "navBean")
 @SessionScoped
 public class NavBean {

private String activePage = "firstAjax";

public String getActivePage() {
    return activePage;
}

public void setActivePage(String activePage) {
    this.activePage = activePage;
}

public void next() {
    System.out.println("next in " + activePage);
    this.setActivePage("lastAjax");
    System.out.println("next out " + activePage);
}

public void back() {
    System.out.println("back in " + activePage);
    this.setActivePage("firstAjax");
    System.out.println("back out " + activePage);
}
}

firstAjax.xhtml和lastAjax.xhtml几乎相同

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:ui="http://java.sun.com/jsf/facelets">
<h:form>
    <h2>content first</h2>
</h:form>
</ui:composition>

1 个答案:

答案 0 :(得分:1)

您的页面无效,因为PrimeFaces拥有自己的ajax引擎。使用p:commandButton时必须使用它。您不需要使用p:ajax代码,因为p:commandButton默认情况下会激活ajax行为,只需使用update属性(相当于render属性{ {1}}组件):

f:ajax

如果你想坚持使用普通的jsf,请使用它(它看起来更像你提到的BalusC的例子):

<h:form>
    <p:commandButton value="next" action="#{navBean.next}" update=":content"/>            
    <p:commandButton value="back" action="#{navBean.back}" update=":content"/>
</h:form>

作为最后一点,必须说<h:form> <f:ajax render=":content" > <h:commandButton value="next" action="#{navBean.next}" /> <h:commandButton value="back" action="#{navBean.back}" /> </f:ajax> </h:form> 标记(至少在PrimeFaces 4.0中)并不支持我们在p:ajax组件之外使用的语法,因为它& #39;无法确定事件属性,因此会抛出:p:commandButton