我在实现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;
}
}
此代码似乎无效。有什么问题?
答案 0 :(得分:2)
实际上,这种方法不起作用。
<f:ajax render=":formWithLabel"/>
基本上如下:
<update id="formWithLabel">
的ajax响应以及更新的HTML。document.getElementById("formWithLabel")
查找元素,以便可以使用ajax响应中的内容替换其内部HTML内容。但是,由于<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>
交换。