Можно ли вернуть ошибку обратной связи, но все же разрешить wicket для обновления моделей компонентов? - PullRequest
6 голосов
/ 02 ноября 2011

У меня есть форма калитки, которая содержит много компонентов ввода TextField. К большинству этих входов подключен валидатор.

Предположим, я ввел 50 значений, и одно из них не проходит валидатор диапазона. Затем Wicket генерирует сообщение об ошибке, но также не обновляет модели, связанные с каждым компонентом. В результате я теряю все 50 значений, которые я только что ввел, и мне приходится вводить их снова.

У меня вопрос, могу ли я попросить Wicket обновить модели тех компонентов, которые имели допустимые значения, но просто сообщить об ошибке для неверного значения?

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

public final void processInput()
{
    inputChanged();
    validate();
    if (hasErrorMessage())
    {
        invalid();
    }
    else
    {
        valid();
        updateModel();
    }
}

Есть ли способ настроить это поведение и достичь моей цели сохранения всех допустимых значений?

1 Ответ

7 голосов
/ 02 ноября 2011

Могу поспорить, что FormComponent.processInput() здесь вообще не вызывается.Когда вы отправляете Form, вызывается Form.process().Там он будет вызывать Form.validate(), что, в свою очередь, вызовет Form.validateComponents(), в конечном итоге используя FormComponent.validate().

Проблема, с которой вы здесь сталкиваетесь, заключается в глобальной обработке Form.process().Форма отправляется полностью или не отправляется вовсе.При сбое FormComponent.validate(), Form.hasError() вернет true, и, следовательно, Form.process() никогда не обновит ни одну из моделей.

Вы можете:

  • Переместить все независимые проверки FormComponent на FormValidator.Там вы можете обновить Модели тех FormComponents, которые прошли валидацию.
  • Реализация Form.onError() и использование там посетителя для обновления моделей действительных FormComponents.
  • Переопределения Form.process() и изменения используемой ветви // If a validation error occurred.ваши собственные методы, чтобы пометить компоненты как допустимые / недействительные, и обновить (или нет) объекты модели, в зависимости от ошибки FormComponent.FormComponent.hasErrorMessage() сообщит вам, если проверка не удалась на определенном FormComponent.

ОБНОВЛЕНИЕ

После обсуждения причин, по которым пользовательский ввод был потерянс помощью OP оказалось, что FormComponents были добавлены в ListView, для которого setReuseItems не было установлено в true.Это приводило к тому, что FormComponents создавалось заново для каждого ListView.populateItem(), поэтому терял весь пользовательский ввод.

Более подробную информацию о природе этой проблемы можно найти здесь :

Однако при использовании ретранслятора необходимо соблюдать некоторые условия.в виде.Обычно повторители очищают свои элементы в начале каждого запроса, когда внутри формы это обычно нежелательно, потому что вы хотите сохранить старые элементы, потому что вы хотите, чтобы они сохранили свое состояние, а не обновляли заново.

Например, если вы используете ListView, вы должны вызвать ListView.setReuseItems (true) внутри формы, чтобы он сохранял старые элементы, а не всегда создавал новые каждый раз.

...