代码之家  ›  专栏  ›  技术社区  ›  Jonik

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

  •  9
  • Jonik  · 技术社区  · 15 年前

    我可以用什么最干净的方法使复选框自动提交它在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>
    

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

    2 回复  |  直到 13 年前
        1
  •  17
  •   Jonik    15 年前

    即使不覆盖onSelectionChanged(),也只需为复选框重写wantonSelectionChangedNotifications()就可以了。

    这样,您就不需要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 往返行程将与 选择更改, 导致 正在更新的模型 (仅此而已) 部件)和选配件 被召唤。

        2
  •  9
  •   Brian Topping    15 年前

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

    推荐文章