You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PrimeFaces selectCheckboxMenu手动选择时默认选中项消失问题

问题:selectCheckboxMenu默认选中的禁用选项在选择其他选项时丢失

在表格中使用PrimeFaces selectCheckboxMenu 组件时,已将部分禁用选项(moneyTypeGrpMan 为 Y 的项)设置为默认选中,初始渲染正常,但手动选择其他选项后,之前默认选中的禁用选项会被自动移除。

相关代码

XHTML代码

<p:column headerText="Money Type Group">
    <p:selectCheckboxMenu id="multiple"
                          multiple="true" emptyLabel="Please select..." updateLabel="true"
                          style="min-width: 15rem" panelStyle="width: 30rem" scrollHeight="250"
                          value="#{employerTakeUI.selectedMoneyGroupList}">
        <p:ajax event="change" listener="#{employerTakeUI.onItemSelect(rowIndex)}" update="employerTakeForm:benefitTypeList" />
        <f:selectItems value="#{employerTakeUI.moneyTypeGroupsList}" var="item"
                       itemValue="#{item.id.moneyTypeGrp}"
                       itemLabel="#{item.moneyTypeGrpDesc}"
                       itemDisabled="#{item.moneyTypeGrpMan eq 'Y'}"/>
    </p:selectCheckboxMenu>
</p:column>

Java初始化代码

selectedMoneyGroupList = new ArrayList<>();
for(MoneyTypeGroup mtg: this.moneyTypeGroupsList){
    if(mtg.getMoneyTypeGrpMan().equalsIgnoreCase("Y")){
        this.selectedMoneyGroupList.add(mtg.getId().getMoneyTypeGrp());
    }
}

原因分析

PrimeFaces在处理多选组件的AJAX提交时,只会提交用户当前勾选的非禁用选项,禁用选项不会被包含在提交参数中。当AJAX请求触发后,后台的selectedMoneyGroupList会被新提交的列表覆盖,导致原本默认选中的禁用选项丢失。

解决方案

方案1:在AJAX监听器中重新保留禁用选项

修改onItemSelect方法,每次触发时重新将禁用选项添加回选中列表,同时保留用户手动选择的非禁用选项:

public void onItemSelect(int rowIndex) {
    // 暂存当前用户选中的非禁用选项
    List<String> tempSelected = new ArrayList<>(selectedMoneyGroupList);
    
    // 清空列表,先重新添加所有禁用的默认选项
    selectedMoneyGroupList.clear();
    for(MoneyTypeGroup mtg : moneyTypeGroupsList) {
        if(mtg.getMoneyTypeGrpMan().equalsIgnoreCase("Y")) {
            selectedMoneyGroupList.add(mtg.getId().getMoneyTypeGrp());
        }
    }
    
    // 添加用户选中的非禁用选项,避免重复
    for(String item : tempSelected) {
        if(!selectedMoneyGroupList.contains(item)) {
            selectedMoneyGroupList.add(item);
        }
    }
    
    // 原有业务逻辑代码...
}

方案2:用只读状态替代禁用状态(业务允许时)

如果业务允许用户看到这些选项但不能取消勾选,可以将itemDisabled替换为itemReadonly(需确认PrimeFaces版本支持该属性),只读选项会被包含在提交参数中,不会丢失:

<f:selectItems value="#{employerTakeUI.moneyTypeGroupsList}" var="item"
               itemValue="#{item.id.moneyTypeGrp}"
               itemLabel="#{item.moneyTypeGrpDesc}"
               itemReadonly="#{item.moneyTypeGrpMan eq 'Y'}"/>

若版本不支持itemReadonly,可通过自定义CSS标记这些选项为不可点击状态,同时确保它们始终被包含在选中列表中。

内容的提问来源于stack exchange,提问作者Govind Rajpurohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:06:02