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

Java Wicket复选框,自动将其更改的值提交给域对象,java,checkbox,wicket,form-submit,Java,Checkbox,Wicket,Form Submit,我可以用什么最干净的方式使复选框自动提交它在Wicket中所属的表单?我根本不想包含提交按钮。该复选框由域对象中的布尔字段支持(在本例中为“帐户”) 省略不相关部分的简化示例: EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id); PropertyModel<Boolean> model = new PropertyModel<Boolean>(a

我可以用什么最干净的方式使复选框自动提交它在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);
EntityModel accModel=newentitymodel(Account.class,id);
PropertyModel模型=新的PropertyModel(accModel,“enabled”);
复选框=新复选框(“cb”,型号);
表格=新表格(“表格”);
表单。添加(复选框);
添加(表格);
HTML:

<form wicket:id="form" id="form" action="">
    <input wicket:id="cb" type="checkbox" />
</form>


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

仅覆盖复选框的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;
    }
});
EntityModel相当清楚地说明了为什么这符合我的要求(强调我的要求):

如果为真,则为 往返将与每个 选择更改,导致 正在更新的型号(仅此) 组件)和OnSelection已更改 被召唤


虽然这可能会奏效,但您最好使用。匿名子类可以连接起来立即接收事件,也可以在复选框本身之外对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
    }
});
final WebMarkupContainer wmc=新WebMarkupContainer(“wmc”);
最终EntityModel accModel=新的EntityModel(Account.class,id);
wmc.setVisible(假);
wmc.setOutputMarkupPlaceholderTag(真);
添加(新的AjaxCheckBox(“cb”,新的PropertyModel(“accModel”,enabled”)){
@凌驾
受保护的void onUpdate(AjaxRequestTarget目标){
setVisible(accModel.isEnabled());
target.addComponent(wmc);
//…编写实体的更多代码
}
});

在这个精心设计的示例中,WebMarkupContainer将与复选框的值同步可见。

这正是wantOnSelectionChangedNotifications的用例。谢谢!!虽然我并不认为这总是“好得多”,但通常确实如此(我在当前项目中已经找到了这样的地方)。AjaxCheckBox的一个缺点似乎是需要“手动”更新域对象,而实际上,PropertyModel会自动进行更新。(有趣的是,这里需要一个类似的PropertyModel,但这还不够。)我认为这个解决方案非常有用。大多数情况下,AJAX与wicket一起使用,这正是我想要的!谢谢+1