0

我有一个相当复杂的表单,表单字段的数量是灵活的。简而言之,模型对象是一个 TLabel (TranslationLabel),其中包含一个 Map of values (translations)。此处的语言是一个枚举,因此想法是为其提供翻译的字段(文本区域)的数量取决于此枚举中的值。

这是我的表格(简化):

公共类 TranslationEditForm 扩展 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();
}

然后就可以了,该字段的值设置为提交的值(空)而不是原始值。

知道是什么原因造成的吗?由于我设置表单的方式(因为使用简单的表单/模型,这与 wicket 示例一样工作正常),wicket 未能做什么?

4

1 回答 1

8

发布为答案,因此可以将问题标记为已解决:

ListView 会在渲染时重新创建其所有项目。这意味着验证将被破坏。查看ListView 的 API 文档

在 ListView 上调用 setReuseItems() 可以解决这个问题。

问候,伯特

于 2011-12-05T22:26:50.963 回答