如何禁用Wicket的CheckGroup组件且不影响表单其余功能正常使用
问题原因
Wicket 中 CheckGroup 的启用、可见状态默认会同步到所有和它绑定的Check组件,若状态控制逻辑意外向上冒泡到父级Form组件,就会出现整份表单连带内部链接都被禁用/隐藏的异常表现。
解决方案
如果你的预期是仅控制复选框的启用、可见状态,不影响列表内的链接以及表单其他功能,可按如下方案调整代码:
Form form = new Form("form"); // 提前提取权限判断结果,避免重复计算 boolean checkOperable = isAuthorized(); CheckGroup checkGroup = new CheckGroup("checkGroup", checkList); // CheckGroup本身保持正常状态,仅控制子项选择器的状态 checkGroup.add(new CheckGroupSelector("groupSelector") { @Override protected void onConfigure() { super.onConfigure(); setEnabled(checkOperable); setVisible(checkOperable); } }); form.add(checkGroup); PropertyListView<MyList> tableList = new PropertyListView<MyList>("table", new PropertyModel(lists, "myList")){ @Override protected void populateItem(ListItem<OfacCustomerMatchFile> item) { Check check = new Check("check", item.getModel(), checkGroup); // 单独给每个复选框设置状态,不会影响同层级的链接组件 check.setEnabled(checkOperable); check.setVisible(checkOperable); item.add(check); item.add(new AjaxFallbackLink("itemLink") { ... }); } }; form.add(tableList);
如果确实需要在某些场景下禁用整个CheckGroup且不影响其他表单组件,可给CheckGroup单独设置状态隔离:重写CheckGroup的onConfigure方法时,额外调用setVersioned(false)避免状态向上传递即可。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

