p:ajax 更新不适用于 p:selectBooleanCheckbox
Posted
技术标签:
【中文标题】p:ajax 更新不适用于 p:selectBooleanCheckbox【英文标题】:p:ajax update not working with p:selectBooleanCheckbox 【发布时间】:2014-08-09 09:20:58 【问题描述】:我正在使用 JSF 2 和 Primefaces 4 并遇到以下问题:
我的 Xhtml 中有以下代码:
<h:form id="form">
<table>
<tr id="formats">
<td>Formats</td>
<td>
<p:selectBooleanCheckbox value="#bean.entity.formatted">
<p:ajax event="change" update="formatsSelect" />
</p:selectBooleanCheckbox>
<p:selectOneMenu id="formatsSelect" rendered="#bean.entity.formatted">
<f:selectItems value="#bean.formats" />
</p:selectOneMenu>
</td>
</tr>
</table>
</h:form>
它输出一个复选框和一个选择菜单,我期望的是,当我选中复选框时,选择菜单应该出现,当我取消选中它时应该消失....但是没有任何反应,我选中并取消选中它并选择菜单不受影响。
理论上这应该有效,因为 selectBooleanCheckbox 值绑定到 entity.formatted 布尔值,并且 selectOneMenu 中呈现的值绑定到 entity.formatted 值,并且 p:ajax 指向更新属性中的正确 id并且事件是正确的。这是我知道的最后一点,因为我在我的 bean 中创建了一个监听器,它打印了 formatted 的值:
public void changeListener()
System.out.println(this.entity.isFormatted());
并将 p:ajax 更改为:
<p:ajax event="change" update="formatsSelect" listener="#bean.changeListener" />
它在控制台中打印了 formatted 的值。 我做错了什么?
【问题讨论】:
【参考方案1】:由于您在组件 (p:selectOneMenu id="formatsSelect"
) 上使用了 rendered
并更新了相同的组件,因此它不起作用。
因为在您更新时,该组件可能尚未添加到组件树中/未出现在组件树中。
所以在它周围使用h:panelGroup
并更新它并在p:selectOneMenu
上使用rendered
。
<p:selectBooleanCheckbox value="#bean.entity.formatted">
<p:ajax event="change" update="formatsSelectPG" />
</p:selectBooleanCheckbox>
<h:panelGroup id="formatsSelectPG">
<p:selectOneMenu id="formatsSelect" rendered="#bean.entity.formatted">
<f:selectItems value="#bean.formats" />
</p:selectOneMenu>
</h:panelGroup>
【讨论】:
以上是关于p:ajax 更新不适用于 p:selectBooleanCheckbox的主要内容,如果未能解决你的问题,请参考以下文章