“显示更多”<h:commandbutton> with ajax </h:commandbutton>

时间:2013-12-02 18:26:07

标签: javascript ajax jsf jsf-2 backing-beans

我在实现MyFaces 2.0中使用JSF。 在我的Web应用程序中,我希望页面上有“显示更多”按钮。用户获取页面,只有按钮和隐藏表单以及一些信息(例如带有标签)。当用户单击此按钮时,他会在显示标签的同一页面上看到。当他再次点击时,标签应该隐藏。

myPage.xhtml:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">

<h:head>
</h:head>

<h:body>
    <h:form>
       <h:commandButton value="show more" action="#{bean.showOrHide}">
           <f:ajax render=":formWithLabel"/>
       </h:commandButton>
    </h:form>  
    <hr/>

    <h:form id="formWithLabel" rendered="#{bean.show}">
       <h:outputLabel value="More information"/>
    </h:form>
</h:body>

Bean.java:

@ManagedBean
@ViewScoped
public class Bean {

  private boolean show;

  //getters, setters

  public void showOrHide(){
    show = !show;
  }
}

此代码似乎无效。有什么问题?

1 个答案:

答案 0 :(得分:2)

实际上,这种方法不起作用。

<f:ajax render=":formWithLabel"/>基本上如下:

  1. JavaScript发送ajax请求。
  2. JSF返回带有<update id="formWithLabel">的ajax响应以及更新的HTML。
  3. JavaScript使用document.getElementById("formWithLabel")查找元素,以便可以使用ajax响应中的内容替换其内部HTML内容。
  4. 但是,由于<h:form id="formWithLabel" rendered="#{bean.show}">永远不会首先呈现,因此JavaScript无法在HTML文档中找到任何内容来替换内部HTML内容和ajax响应中的内容,并且无声地失败。

    您需要将其包装在另一个始终呈现为HTML输出的JSF组件中,以便JavaScript可以在需要根据ajax响应更新HTML文档时找到它。

    <h:form>
       <h:commandButton value="show more" action="#{bean.showOrHide}">
           <f:ajax render=":groupWithLabel"/>
       </h:commandButton>
    </h:form>  
    
    <h:panelGroup id="groupWithLabel">
        <h:form id="formWithLabel" rendered="#{bean.show}">
           <h:outputLabel value="More information"/>
        </h:form>
    </h:panelGroup>
    

    另见:


    对于具体问题,

    无关,当您打算在此表单上调用操作时,您可能会遇到新问题。您可能希望将<h:panelGroup><h:form>交换。

    另见: