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的主要内容,如果未能解决你的问题,请参考以下文章

更新约束不适用于 UITableView snapkit

不适用于更新语句的情况

更新的 Cookie 不适用于 Response.Redirect

Databricks 更新表不适用于 orc 格式

更新事件不适用于 EWS 访问被拒绝

Firestore 实时更新不适用于 recyclerview