Чекбокс Wicket, который автоматически передает измененное значение объекту домена - PullRequest
9 голосов
/ 24 ноября 2010

Какой самый простой способ сделать флажок автоматически отправлять форму, к которой он принадлежит, в 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 ]

17 голосов
/ 24 ноября 2010

Просто переопределение wantOnSelectionChangedNotifications () для флажка & mdash; даже без переопределения onSelectionChanged () & mdash; похоже, выполняет то, что я хочу.

Таким образом, вам не нужна форма на стороне Java, поэтому приведенный выше код будет выглядеть так:

EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id);

add(new CheckBox("cb", new PropertyModel<Boolean>(accModel, "enabled")){
    protected boolean wantOnSelectionChangedNotifications() {
        return true;
    }
});

Не стесняйтесь добавлять лучшие решения или лучшее объяснение того, что происходит с этим подходом!

Редактировать : При ближайшем рассмотрении, я думаю Javadoc метода достаточно ясно дает понять, почему это делает то, что я хотел (выделение мое):

Если это правда, туда и обратно будет генерироваться с каждым изменение выбора, , приводящее к модель обновляется (только этого компонент) и onSelectionChanged будучи призванным.

9 голосов
/ 06 декабря 2010

Хотя это может сработать, вам гораздо лучше использовать AjaxCheckBox . Анонимный подкласс может быть подключен для немедленного получения событий, а также для внесения изменений в пользовательский интерфейс вне самого флажка.

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 будет отображаться синхронно со значением флажка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...