У меня довольно сложная форма в том смысле, что число полей формы является гибким.Короче говоря, объект модели - это 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();
}
тогда все в порядке, значение поля устанавливается равным представленному значению (пусто) вместо исходного значения.
Есть идеи, что вызывает это?Что калитка не может сделать, потому что способ, которым я настроил форму (потому что с простой формой / моделью это работает хорошо, как примеры калитки)?