带有 selectBooleanCheckbox 的 JSF ReRender 支持

Posted

技术标签:

【中文标题】带有 selectBooleanCheckbox 的 JSF ReRender 支持【英文标题】:JSF ReRender support with selectBooleanCheckbox 【发布时间】: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”不会消失。我做错了什么?

【问题讨论】:

【参考方案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"

【讨论】:

以上是关于带有 selectBooleanCheckbox 的 JSF ReRender 支持的主要内容,如果未能解决你的问题,请参考以下文章

如何在 <h:dataTable> 或 <ui:repeat> 中使用 <h:selectBooleanCheckbox> 来选择多个项目?

p:ajax 更新不适用于 p:selectBooleanCheckbox

如何使用p:selectBooleanCheckbox切换禁用/启用PrimeFaces组件

在页面刷新时设置 selectBooleanCheckbox 的值

可编辑DataTable中的SelectBooleanCheckbox不会更改

Primefaces p:selectOneMenu 或 p:selectBooleanCheckbox 不触发更改事件,具体取决于我是不是使用 h:form