Wicket复选框,自动将其更改的值提交给域对象

什么是最简洁的方法,我可以使一个复选框自动提交它属于Wicket的表单? 我根本不想要包含提交按钮。 该复选框由域对象中的布尔字段(在本例中为“Account”)支持。

省略了无关部分的简化示例:

EntityModel accModel = new EntityModel(Account.class, id); PropertyModel model = new PropertyModel(accModel, "enabled"); CheckBox checkBox = new CheckBox("cb", model); Form form = new Form("form"); form.add(checkBox); add(form); 

HTML:

 

编辑 :为了澄清,我的目标只是在切换复选框时更改域对象的字段( – >数据库中的值)。 任何(干净,简单)实现这一目标的方法都可以。 (我不确定你是否真的需要这个表格。)

只是覆盖了checkboxOnSelectionChangedNotifications()的复选框 – 即使没有覆盖onSelectionChanged() – 似乎做我想要的。

这样你就不需要Java端的表单,所以上面的代码将成为:

 EntityModel accModel = new EntityModel(Account.class, id); add(new CheckBox("cb", new PropertyModel(accModel, "enabled")){ protected boolean wantOnSelectionChangedNotifications() { return true; } }); 

随意添加更好的解决方案,或更好地解释这种方法正在发生的事情!

编辑 :仔细观察,我猜方法的Javadoc让我很清楚为什么这样做我想要的(强调我的):

如果为true,则将在每次选择更改时生成往返, 从而导致模型更新 (仅此组件)和onSelectionChanged被调用。

虽然这可能有用 ,但使用AjaxCheckBox要好得多 。 可以连接匿名子类以立即接收事件,也可以在复选框本身之外对UI进行更改。

 final WebMarkupContainer wmc = new WebMarkupContainer("wmc"); final EntityModel accModel = new EntityModel(Account.class, id); wmc.setVisible(false); wmc.setOutputMarkupPlaceholderTag(true); form.add(new AjaxCheckBox("cb", new PropertyModel(accModel, "enabled")) { @Override protected void onUpdate(AjaxRequestTarget target) { wmc.setVisible(accModel.isEnabled()); target.addComponent(wmc); // .. more code to write the entity } }); 

在这个人为的例子中,WebMarkupContainer将与复选框的值同步显示。