p:selectBooleanCheckbox与p:ajax更新不起作用

7
我正在使用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}" /> 

它在控制台中打印了格式化的值。 我做错了什么?


这个回答解决了你的问题吗?Ajax更新/渲染在具有已渲染属性的组件上不起作用 - Jasper de Vries
1个回答

17

由于您在组件(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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接