Можно ли вернуть ошибку обратной связи, но разрешить калитке обновлять модели компонентов?

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

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

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

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

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

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


person Andrew Fielden    schedule 02.11.2011    source источник
comment
Какие валидаторы вы используете? Пользовательский ввод следует сохранить, даже если есть ошибки проверки. Не могли бы вы показать один из этих валидаторов, как он прикреплен к FormComponents и как обрабатывается отправка формы?   -  person Xavi López    schedule 02.11.2011


Ответы (1)


Готов поспорить, что FormComponent.processInput() здесь вообще не вызывают. Когда вы отправляете Form, _ 3_. Там он вызовет _ 4_, который, в свою очередь, вызовет _ 5 _, в конечном итоге используя FormComponent.validate().

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

Ты мог бы:

  • Переместите все независимые проверки FormComponent в FormValidator. Там вы можете выбрать обновление моделей тех FormComponents, которые прошли проверку.
  • Внедрите Form.onError() и используйте посетителя для обновления моделей действительных FormComponents.
  • Переопределите Form.process() и измените _ 17_, чтобы использовать собственные методы для пометки компонентов как действительных / недопустимых и обновления (или нет) объектов модели, в зависимости от FormComponent, в котором есть ошибки. FormComponent.hasErrorMessage() сообщит вам, если проверка не удалась на определенном FormComponent.

ОБНОВЛЕНИЕ

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

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

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

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

person Xavi López    schedule 02.11.2011