Wicket:不再选中复选框时收到通知

Wicket: Get notified when no checkbox is selected anymore

这是 Wicket GUI (Wicket 7.6.0) 的一部分,用作显示一些数据库条目的前端。

在这个特定页面上,我们有一个表单,用户可以在其中通过指定例如搜索条目。开始日期、结束日期等以限制结果。点击按钮后,搜索条目将显示在此搜索表单下方。

这些结果使用带分页的 Wicket DataTable 显示。 table 中的条目有一个复选框。这是通过自定义 CheckBoxPanel(从 Panel 扩展)实现的,其中添加了 Check 实例(org.apache.wicket.markup.html.form.Check)。

现在,我想对每个 select unselect 复选框做出反应。这样做的原因是我们希望即使在第二个列表中分页时也能跟踪 selection 的项目。

我将 AjaxFormChoiceComponentUpdatingBehavior 添加到组中(请参阅下面的方法来源 addCheckboxes)。只要至少一个复选框被 selected 就可以工作——每次点击一个复选框都会打印调试语句。

但是,当取消select最后一个复选框时,onUpdate() 方法不会 被调用,尽管 AJAX 调用已制作(使用 Firefox 开发者工具 验证)。请求负载为 group%3Aactions=。当我 select 一个项目时,请求有效负载是例如:group=check4&group%3Aactions=.

我的问题是: 如果 none 项再被 select 编辑,有没有办法得到通知?这是保持前面提到的 "second list" 同步所必需的。

解决方案不需要使用AJAX,经典的POST解决方案也可以。

private void addCheckboxes() {
    System.out.println("addCheckboxes called!");
    selectedModel = new CollectionModel<FaultModel>(new ArrayList<FaultModel>());
    group = new CheckGroup<FaultModel>("group", selectedModel);
    group.onSelectionChanged();
    group.setRequired(Boolean.TRUE);

    CustomCheckGroupSelector<FaultModel> groupSelector = new CustomCheckGroupSelector<>("groupselector", rows.isEmpty());

    RemarkModalWindow remarkModal = new RemarkModalWindow("remarkModal", selectedModel);
    IndicatingAjaxButton actionButton = new ActionButton<FaultModel>("execute", this, remarkModal, rows.isEmpty());

    DefaultDataTable<?, String> table = TableFactory.getTable2(CustomType.FAULT, rows, page);
    group.add(table);
    group.add(groupSelector);
    group.add(remarkModal);
    group.add(actionButton);

    group.add(new AjaxFormChoiceComponentUpdatingBehavior() {
        @Override protected void onUpdate(AjaxRequestTarget target) {
            System.out.println("!! onUpdate !! Adding selected items to second list.");
        }
    });

    add(group);
}
```

问题是,您已设置 group.setRequired(Boolean.TRUE);,因此根本没有任何选择实际上不是有效状态,这就是为什么未调用 AjaxFormChoiceComponentUpdatingBehavior 的 onUpdate(AjaxRequestTarget target) 的原因。

您可以在 AjaxFormChoiceComponentUpdatingBehavior 中设置 group.setRequired(false); 或重写 onError(AjaxRequestTarget target, RuntimeException e) 方法,当需要表单组件时(除其他错误外)没有选择任何元素时调用该方法。