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

Jon*_*nik 9 java checkbox wicket form-submit

什么是最简洁的方法,我可以使一个复选框自动提交它所属的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);
Run Code Online (Sandbox Code Playgroud)

HTML:

<form wicket:id="form" id="form" action="">
    <input wicket:id="cb" type="checkbox" />
</form>
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*nik 17

只是覆盖了checkboxOnSelectionChangedNotifications()的复选框 - 即使没有覆盖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;
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

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


Bri*_*ing 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
    }
});
Run Code Online (Sandbox Code Playgroud)

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