Можно ли динамически изменять компонент формы Wicket, если для него установлено значение «требуется»? - PullRequest
2 голосов
/ 12 ноября 2010

РЕДАКТИРОВАТЬ:
Этот вопрос изначально был о флажках, но я получаю такое же поведение с выпадающим списком.Код:

productInput = new DropDownChoice<String>("productInput",
                                          new PropertyModel<String>(this, "productSelection"),
                                          products);

productInput.add(new AjaxFormComponentUpdatingBehavior("onchange") {
    @Override
    protected void onUpdate(AjaxRequestTarget target)
    {
        if (productSelection == null) // Breakpoint is set on this line
        {
            updateDropdownsAfterFieldDisabled(1, target);
        }
        else
        {
            updateDropdownsAfterFieldEnabled(1, target);
        }
    }
});

Если для productInput не установлено обязательное значение, точка останова срабатывает каждый раз при переходе от выбора какого-либо значения к выбору опции пустой строки.Если он установлен на обязательный, точка останова никогда не будет достигнута.


Возможно ли динамически / AJAX-ishly изменить компонент формы Wicket, если он проверяется с помощью setRequired(true);?Вот простой, хотя и надуманный пример, чтобы показать, что я имею в виду:

Проезжающие автомойки на автозаправочных станциях, как правило, три или четыре уровня обслуживания.Каждый включает в себя все, что предусмотрено нижними уровнями, и наносит еще один слой воска или дополнительное полоскание или что-то еще.Интерфейсы для стирки обычно имеют четыре кнопки с подсветкой ( пример ).Когда пользователь нажимает одну из кнопок, включается соответствующий индикатор вместе со всеми индикаторами более дешевых уровней;огни для более хороших уровней выключаются.Это поведение моделируется этим кодом:

boolean economy, standard, deluxe, ultimate = false;

CheckBox economyBox = new CheckBox("economyBox",
                                   new PropertyModel<Boolean>(this, "economy"));
// Similar declarations for standardBox, deluxeBox and ultimatebox

OnChangeAjaxBehavior standardChangeListener = new OnChangeAjaxBehavior() {
    protected void onUpdate(AjaxRequestTarget target)
    {
        // If "standard" is activated, also turn on the "economy" light
        if (standard)
        {
            economy = true;
            target.addComponent(economyBox);
        }
        // If "standard" is deactivated, deactivate "deluxe" and "ultimate"
        else if (!standard)
        {
            deluxe = false;
            ultimate = false;
            target.addComponent(deluxeBox);
            target.addComponent(ultimateBox);
        }
    }
};
standardBox.add(standardChangeListener);
// Similar listeners declared for the other three checkboxes

Я протестировал этот код - ну, настоящий код, который является упрощенной версией - и он работает, как и ожидалось.Но добавьте economyBox.setRequired(true);, и окно перестает динамически обновляться.Есть ли способ добавить проверку, не нарушая поведение «связанных флажков»?

1 Ответ

0 голосов
/ 12 ноября 2010

Я не вижу здесь ничего плохого, кроме вас

        target.addComponent(standardBox);

где я думаю, что вы намеревались

        target.addComponent(economyBox);

Валидация должна нормально взаимодействовать с OnChangeAjaxBehavior. Я вполне уверен, что использовал оба в некоторых формах, хотя не думаю, что с флажками.

Я не уверен, что идея проверки с помощью economyBox.setRequired(true); имеет здесь смысл. Вы предоставляете значения, по умолчанию false для всех флажков, в вашей модели, так что нет реального способа что-либо фактически пропустить в этом контексте.

Более разумной проверкой может быть то, что необходимо проверить что-то , но для этого потребуется другой валидатор, определенный для формы в целом или для FormComponent, включающий все ваши флажки. *

EDIT: Исходя из ваших правок об обнаружении той же проблемы с DropDownChoice, я провел эксперимент.

Здесь приведен пример AjaxFormComponentUpdatingBehavior с DropDownChoice компонентами здесь . Я скачал код для этого, добавил

    models.setRequired(true);
    makes.setRequired(true);
    add(new FeedbackPanel("messages"));

и, конечно, добавлена ​​разметка для панели обратной связи.

Он проверил обязательные поля и продолжил обновлять раскрывающийся список модели на основе значения раскрывающегося списка make.

Поскольку для меня это работало нормально, я бы порекомендовал вам попробовать то же самое, посмотреть, как оно работает, а затем сравнить с вашим кодом.

...