【问题标题】:JSF ReRender support with selectBooleanCheckbox带有 selectBooleanCheckbox 的 JSF ReRender 支持
【发布时间】:2011-01-03 00:31:04
【问题描述】:

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

【问题讨论】:

    标签: jsf seam richfaces ajax4jsf rerender


    【解决方案1】:

    您需要将componentToReRender 包装在以下任一格式中:

    &lt;h:panelGroup id="componentToReRenderWrapper"&gt;

    &lt;a4j:outputPanel id="componentToReRenderWrapper"&gt;

    所以,实际上你将拥有:

    <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>
    

    如果您使用panelGroup,请更改reRender="componentToReRenderWrapper",或者如果您使用outputPanel,请删除该属性。

    RichFaces 文档中找到了确切的解释:

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

    【讨论】:

    • 看起来确实如此,但渲染有点棘手。我用文档中的详细信息更新了我的答案
    • 有趣...我会在星期一早上试试这个。
    • 将要重新渲染的组件包装在 h:panelGroup 中按您的预期工作。我现在遇到的唯一问题是这些框需要几秒钟才能出现/消失,我不确定如何让用户知道他们的更改受到了影响。谢谢!!
    【解决方案2】:

    别忘了在 a4j:outputPanel 上设置 ajaxRendered="true"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-23
      • 2012-12-20
      • 1970-01-01
      • 2019-12-27
      • 2014-01-17
      • 2014-06-16
      • 2010-12-17
      相关资源
      最近更新 更多