【问题标题】:Wicket checkbox that automatically submits its changed value to domain object自动将其更改的值提交给域对象的 Wicket 复选框
【发布时间】:2011-05-15 00:08:31
【问题描述】:

让复选框自动提交它在 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>

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

【问题讨论】:

    标签: java checkbox wicket form-submit


    【解决方案1】:

    只为复选框覆盖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 可以相当清楚地说明为什么这样做是我想要的(强调我的):

    如果为真,则 往返将与每个生成 选择更改,导致 模型正在更新(仅此 组件)和 onSelectionChanged 被调用。

    【讨论】:

    • 这正是 wantOnSelectionChangedNotifications 的用例。 (+1)
    【解决方案2】:

    虽然这可能有效,但您最好使用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 将与复选框的值同步显示。

    【讨论】:

    • 谢谢(+1)!虽然我不认为这总是“好得多”,但通常确实如此(我已经在我当前的项目中找到了这样的地方)。 AjaxCheckBox 的一个缺点似乎是需要“手动”更新域对象,而在plain CheckBox approach 中,PropertyModel 会自动实现这一点。 (有趣的是这里需要一个类似的PropertyModel,但这还不够。)
    • 我认为这个解决方案是最有用的。大多数时候 AJAX 与检票口一起使用,这正是我想要的!谢谢+1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2023-03-17
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多