PrimeFaces 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
相关产品推荐
相关产品推荐

