componentToReRenderWrapper

componentToReRenderWrapper

我有一个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 &amp;&amp; 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 &amp;&amp; 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”包装组件。

10-01 12:06