我使用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值绑定到实体。格式化的布尔值和selectOneMenu中的呈现值被绑定到实体。格式化的值,并且p:ajax
指向update属性中的正确id,并且事件是正确的。我之所以知道这一点,是因为我在bean中创建了一个侦听器,该侦听器打印了格式化:
public void changeListener(){
System.out.println(this.entity.isFormatted());
}
并将p:ajax改为:
<p:ajax event="change" update="formatsSelect" listener="#{bean.changeListener}" />
它在控制台中打印了格式化的值。我做错了什么?
由于您在组件(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>