3

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

4

2 回答 2

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

于 2010-01-08T22:25:59.247 回答
2

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

于 2010-08-19T13:56:23.060 回答