0

フォームフィールドの数が柔軟であるという点で、かなり複雑なフォームがあります。つまり、モデル オブジェクトは、値 (翻訳) のマップを含む 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();
}

フィールドの値は、元の値ではなく、送信された値 (空) に設定されます。

これの原因は何ですか?フォームを設定した方法が原因でウィケットが失敗しているのは何ですか (単純なフォーム/モデルでは、これはウィケットの例のように正常に機能しているため)?

4

1 に答える 1

8

回答として投稿されたので、質問を解決済みとしてマークできます。

ListView は、レンダリング時にすべてのアイテムを再作成します。これは、検証が壊れることを意味します。ListView の API ドキュメントをご覧ください

ListView で setReuseItems() を呼び出すと、これが解決されます。

よろしく、バート

于 2011-12-05T22:26:50.963 に答える