JSF ReRender支持selectBooleanCheckbox

时间:2010-01-08 17:40:28

标签: jsf seam richfaces ajax4jsf rerender

我有一个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”不会消失。我做错了什么?

2 个答案:

答案 0 :(得分:10)

您需要将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最常见的问题是将其指向具有“呈现”属性的组件。注意,JSF没有在浏览器DOM中标记应该放置组件结果的位置,以防“呈现”条件返回false。因此,在Ajax请求期间呈现组件之后,RichFaces将呈现的代码传递给客户端,但不更新页面,因为更新的位置未知。您需要指向其中一个没有“呈现”属性的父组件。作为替代方法,您可以使用layout =“none”包装组件。

答案 1 :(得分:2)

不要忘记在a4j上设置ajaxRendered =“true”:outputPanel