2010-01-08 65 views
3

我有一个JSF页面,我希望在这个页面上有一个复选框,当点击它时,会从页面添加/删除某些其他表单域。这里是(简化)的代码,我现在有复选框:JSF ReRender支持selectBooleanCheckbox

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

回答

9

你需要用的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文档的确切的解释:

使用重新呈现时其指向具有“渲染”属性的分量最常见的问题。请注意,如果“渲染”条件返回false,那么JSF不会标记浏览器DOM中放置组件结果的位置。因此,在Ajax请求期间呈现组件后,RichFaces将呈现的代码交付给客户端,但不更新页面,因为更新位置未知。您需要指向没有“呈现”属性的父组件之一。作为替代方案,您可以使用layout =“none”来包装组件。

+0

似乎它实际上做,但渲染是有点棘手。我从文档 – Bozho 2010-01-09 05:52:03

+0

的详细信息更新了我的答案。有趣...我会在星期一早上试试这个。 – iandisme 2010-01-09 21:41:46

+0

将包含要在h:panelGroup中重新渲染的组件按预期工作。我现在遇到的唯一问题是盒子需要几秒钟才会出现/消失,我不知道如何让用户知道他们的变化正在受到影响。谢谢!! – iandisme 2010-01-11 17:10:29

2

不要忘记在A4J设置ajaxRendered =“真”:outputPanel