什么是最简洁的方法,我可以让一个复选框自动提交它所属的Wicket表格?我根本不想要包含提交按钮。该复选框由域对象中的布尔字段(在本例中为“帐户”)支持。
省略了无关部分的简化示例:
EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id);
PropertyModel<Boolean> model = new PropertyModel<Boolean>(accModel, "enabled");
CheckBox checkBox = new CheckBox("cb", model);
Form form = new Form("form");
form.add(checkBox);
add(form);
HTML:
<form wicket:id="form" id="form" action="">
<input wicket:id="cb" type="checkbox" />
</form>
修改:为了澄清,我的目标只是在切换复选框时更改域对象的字段( - >数据库中的值)。任何(干净,简单)实现这一目标的方法都可以。 (我不确定你是否真的需要这个表格。)
答案 0 :(得分:17)
为复选框覆盖wantOnSelectionChangedNotifications(),即使没有覆盖onSelectionChanged() - 似乎也按我的意愿行事。
这样你就不需要Java端的表单,所以上面的代码将成为:
EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id);
add(new CheckBox("cb", new PropertyModel<Boolean>(accModel, "enabled")){
protected boolean wantOnSelectionChangedNotifications() {
return true;
}
});
随意添加更好的解决方案,或更好地解释这种方法正在发生的事情!
编辑:经过仔细检查,我猜the method's Javadoc能够清楚地说明为什么这样做符合我的要求(强调我的):
如果是真的,a 每个都会生成往返 选择改变,导致 模型正在更新(仅此而已 component)和onSelectionChanged 被召唤。
答案 1 :(得分:9)
虽然这可行,但使用AjaxCheckBox会更好。可以连接匿名子类以立即接收事件,也可以在复选框本身之外对UI进行更改。
final WebMarkupContainer wmc = new WebMarkupContainer("wmc");
final EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id);
wmc.setVisible(false);
wmc.setOutputMarkupPlaceholderTag(true);
form.add(new AjaxCheckBox("cb", new PropertyModel<Boolean>(accModel, "enabled")) {
@Override
protected void onUpdate(AjaxRequestTarget target) {
wmc.setVisible(accModel.isEnabled());
target.addComponent(wmc);
// .. more code to write the entity
}
});
在这个人为的例子中,WebMarkupContainer将与复选框的值同步显示。