我有一个JSF页面,我想在其中有一个复选框,单击该复选框将在页面中添加/删除某些其他表单字段。这是我当前为复选框使用的(简化)代码:
<h:selectBooleanCheckbox title="showComponentToReRender" value="#{backingBean.showComponentToReRender}">
<a4j:support event="onsubmit" reRender="componentToReRender" />
</h:selectBooleanCheckbox>
这是我要隐藏的组件的代码:
<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 && backingBean.showComponentToReRender}">
<s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>
当前,单击复选框不会执行任何操作。那“ selectOneMenu”不会消失。我究竟做错了什么?
最佳答案
您需要将componentToReRender
包装在以下任意一种中:<h:panelGroup id="componentToReRenderWrapper">
要么<a4j:outputPanel id="componentToReRenderWrapper">
因此,实际上,您将拥有:
<h:panelGroup id="componentToReRenderWrapper">
<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 && backingBean.showComponentToReRender}">
<s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>
</h:panelGroup>
并在使用
reRender="componentToReRenderWrapper"
的情况下更改panelGroup
,或在使用outputPanel
的情况下删除该属性。在RichFaces文档中找到了确切的解释:
使用reRender的最常见问题是将其指向具有“ rendered”属性的组件。注意,如果“ rendered”条件返回false,JSF不会在浏览器DOM中标记应放置组件结果的位置。因此,在Ajax请求期间呈现组件之后,RichFaces将呈现的代码传递给客户端,但不会更新页面,因为更新的位置未知。您需要指向没有“ rendered”属性的父组件之一。或者,您可以使用layout =“ none”包装组件。