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)
方法,当需要表单组件时(除其他错误外)没有选择任何元素时调用该方法。
这是 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)
方法,当需要表单组件时(除其他错误外)没有选择任何元素时调用该方法。