Поля формы сбрасываются при ошибке проверки - PullRequest
0 голосов
/ 06 декабря 2011

У меня довольно сложная форма в том смысле, что число полей формы является гибким.Короче говоря, объект модели - это TLabel (TranslationLabel), который содержит карту значений (переводы).Язык здесь является перечислением, поэтому идея заключается в том, что количество полей (текстовых областей), для которых дан перевод, зависит от значений в этом перечислении.

Это моя форма (упрощенно):

открытый класс TranslationEditForm расширяет форму {

private final static List<Language> LANGUAGES = newArrayList(Language.values());

public TranslationEditForm(String id, final TranslationLabelView label) {
    super(id, new CompoundPropertyModel<TranslationLabelView>(label));

    ListView<Language> textAreas = new ListView<Language>("translationRepeater", LANGUAGES) {

        @Override
        protected void populateItem(final ListItem<Language> itemLang) {
            //loop through the languages and create 1 textarea per language
            itemLang.add(new Label("language", itemLang.getModelObject().toString()));
            Model<String> textModel = new Model<String>() {

                @Override
                public String getObject() {
                    //return the value for current language
                    return label.getValue(itemLang.getModelObject());
                }

                @Override
                public void setObject(String object) {
                    //set the value for current language
                    label.getTranslations().put(itemLang.getModelObject(), object);
                }
            };
            itemLang.add(new TextArea<String>("value", textModel).setRequired(true));
        }
    };
    //add the repeater containing a textarea per language to the form
    this.add(textAreas);
}
}

Теперь все работает нормально, для каждого языка создается 1 текстовая область, и ее значение также задается правильно;даже больше, когда изменено, модель обновляется как предназначено.

Если вы отправляете форму после очистки текстовой области (так что изначально было значение), то, конечно, есть ошибка проверки (обязательно).Нормальным (wicket) поведением было бы то, что недопустимое поле все еще пусто, но по какой-то причине исходное значение сбрасывается, и я не понимаю, почему.

Если я переопределяю onError следующим образом:

@Override
protected void onError() {
    this.updateFormComponentModels();
}

тогда все в порядке, значение поля устанавливается равным представленному значению (пусто) вместо исходного значения.

Есть идеи, что вызывает это?Что калитка не может сделать, потому что способ, которым я настроил форму (потому что с простой формой / моделью это работает хорошо, как примеры калитки)?

1 Ответ

8 голосов
/ 06 декабря 2011

Опубликовано как ответ, поэтому вопрос можно пометить как решенный:

ListView воссоздает все свои элементы во время рендеринга. Это означает, что проверка будет нарушена. Взгляните на API документ ListView

Вызов setReuseItems () в ListView решает эту проблему.

С уважением, Bert

...