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

ZKOSS 7.0.0 互斥复选框实现与可清空单选组问题咨询

ZK 7.0.0 互斥选择功能实现方案

复选框互斥逻辑修正(无需固定ID、适配列表多选场景)

当前实现失效的核心原因有两点:

  • 勾选其中一个复选框时,没有同步将同一条数据对应的另一个互斥字段置为未选中状态
  • nonaddebitata方法的@NotifyChange注解漏写了flagAddebitata字段,即使后端更新了值前端也不会同步刷新

直接修改后端两个Command方法即可,不需要调整zul页面的组件ID,所有状态绑定到列表项对应的DTO字段,天然适配多选场景:

@Command
@NotifyChange ({ "flagAddebitata","nonAddebitare", "selectedRic"})
public void addebitata(@BindingParam("fladd") boolean fladd,@BindingParam("idPer")int idPerizia ) {
    selectedRic = new HashSet<>();
    for(AddebitoClienteViewDTO add : carList) {
        if(add.getIdPerizia() == idPerizia) {
            add.setFlagAddebitata(booleanToString.apply(fladd));
            // 勾选当前复选框时,自动取消另一个互斥复选框的选中状态
            if (fladd) {
                add.setNonAddebitare("0");
            }
            selectedRic.add(add);
        }
    }
}

@Command
// 补全flagAddebitata字段的变更通知
@NotifyChange ({ "flagAddebitata","nonAddebitare", "selectedRic"})
public void nonaddebitata(@BindingParam("flnoadd") boolean flnoadd,@BindingParam("idPer")int idPerizia ) {
    selectedRic = new HashSet<>();
    for(AddebitoClienteViewDTO add : carList) {
        if(add.getIdPerizia() == idPerizia) {
            add.setNonAddebitare(booleanToString.apply(flnoadd));
            // 勾选当前复选框时,自动取消另一个互斥复选框的选中状态
            if (flnoadd) {
                add.setFlagAddebitata("0");
            }
            selectedRic.add(add);
        }
    }
}

Radiogroup 支持全不选的实现方式

ZK原生Radiogroup本身没有强制必须选中一项的限制,不需要写额外的Java清空函数,只要按以下方式配置即可:

  1. 不在后端给Radiogroup的selectedItem设置初始默认值,页面加载时默认就是全不选状态
  2. 给DTO新增一个选项绑定字段(比如selectedChargeOption),值为null时对应全不选,值为"add"对应选中“已计费”,值为"noadd"对应选中“不计费”
  3. 如果需要支持点击已选中的单选项取消选中,直接在zul上给radio加一行客户端逻辑即可,无需请求后端:
<cell colspan="4">
    <radiogroup selectedItem="@bind(each.selectedChargeOption)">
        <radio label="${labels.label.giaAddebitata}" value="add"
               disabled="@load(each.statoContabile eq 4)"
               onCheck="if(self.isSelected()) self.getRadiogroup().setSelectedItem(null)"/>
        <radio label="${labels.label.nonAddebitare}" value="noadd"
               disabled="@load(each.statoContabile eq 4)"
               onCheck="if(self.isSelected()) self.getRadiogroup().setSelectedItem(null)"/>
    </radiogroup>
</cell>

内容的提问来源于stack exchange,提问作者Enrico Brambilla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:48:54