带有 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 && backingBean.showComponentToReRender">
<s:selectItems value="#valuesList" var="value"/>
</h:selectOneMenu>
目前,单击复选框没有任何作用; “selectOneMenu”不会消失。我做错了什么?
【问题讨论】:
【参考方案1】:您需要将componentToReRender
包装在以下任一格式中:
<h:panelGroup id="componentToReRenderWrapper">
或
<a4j:outputPanel id="componentToReRenderWrapper">
所以,实际上你将拥有:
<h:panelGroup id="componentToReRenderWrapper">
<h:selectOneMenu id="componentToReRender" value="#backingBean.value" rendered="#valuesList.rowCount>1 && 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