フォームフィールドの数が柔軟であるという点で、かなり複雑なフォームがあります。つまり、モデル オブジェクトは、値 (翻訳) のマップを含む TLabel (TranslationLabel) です。ここでの言語は列挙型であるため、翻訳が与えられるフィールド (テキスト領域) の数は、この列挙型の値に依存するという考え方です。
これは私のフォームです(簡略化):
public class TranslationEditForm extends Form {
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 つのテキスト領域が作成され、その値も適切に設定されます。さらに、モデルを変更すると、意図したとおりに更新されます。
テキスト領域を空にした後にフォームを送信すると (元は値があったため)、もちろん検証エラーが発生します (必須)。通常の (ウィケット) 動作では、無効なフィールドはまだ空ですが、何らかの理由で元の値がリセットされ、その理由がわかりません。
次のように onError をオーバーライドすると:
@Override
protected void onError() {
this.updateFormComponentModels();
}
フィールドの値は、元の値ではなく、送信された値 (空) に設定されます。
これの原因は何ですか?フォームを設定した方法が原因でウィケットが失敗しているのは何ですか (単純なフォーム/モデルでは、これはウィケットの例のように正常に機能しているため)?