javascript - "show more"<h :commandButton> with ajax

标签 javascript ajax jsf jsf-2 backing-beans

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

我的页面.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;
  }
}

此代码似乎无效。怎么了?

最佳答案

确实,这种方法行不通。

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

  1. JavaScript 发送一个 ajax 请求。
  2. JSF 返回带有 <update id="formWithLabel"> 的 ajax 响应更新后的 HTML。
  3. JavaScript 使用 document.getElementById("formWithLabel")找到该元素,以便其内部 HTML 内容可以替换为来自 ajax 响应的内容。

但是,作为 <h:form id="formWithLabel" rendered="#{bean.show}">永远不会首先呈现,JavaScript 无法在 HTML 文档中找到任何内容来用来自 ajax 响应的内容替换内部 HTML 内容,并且静默失败。

您需要将它包装在另一个 JSF 组件中,该组件始终呈现为 HTML 输出,以便 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> .

另见:

关于javascript - "show more"<h :commandButton> with ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20335186/

相关文章:

javascript - react redux 异步操作

javascript - 使用 JQuery 和 Flask 的动态下拉不起作用

java - <a4j :commandbutton> doesn't show <h:message> created on its action method

jsf - 如何检查服务器使用的是哪个版本的 EL

google-app-engine - java.io.PrintWriter.write 处的 java.lang.NullPointerException

javascript - 防止剑道文本框中出现数值

javascript - 为数组的每个元素发出查询

javascript - 如何在 JavaScript 中有条件合并列表中的某些元素?

java - 如何控制 JsonView 外部/打包对象属性的可见性?

javascript - 使用 JavaScript 函数更改函数