2011-12-05 36 views
0

我有一個相當複雜的表單,其表單字段的數量是flexibel。簡而言之,模型對象是一個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個,文本區域的每種語言創建,其值也設置很好;甚至在更改模型按預期進行更新時更是如此。

如果您在清空文本區域(因此最初有一個值)之後提交表單,那麼當然存在驗證錯誤(必需)。正常(檢票)的行爲將是無效字段仍然是空的,但由於某種原因,原來的價值被重置,我不明白爲什麼。

如果我重寫的onError這樣的:

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

則罰款,該字段的值設置爲提交的值(空)而不是原始值。

任何想法是什麼造成這種情況?什麼是wicket因爲我設置窗體的方式而無法完成(因爲使用簡單的窗體/模型,這與wicket示例一樣工作正常)?

+0

看一看的ListView的API(http://wicket.apache.org/apidocs/1.5/org/apache/wicket/markup/html/list/ListView.html) ESP。 setReuseItems()。 – bert

+0

你是我今天的英雄:-)。請再次發佈這個答案,我可以接受你的答案。 –

回答

8

發佈的答案,所以這個問題可以被標記爲解決:

的ListView不重新在渲染時的所有項目。這意味着驗證將被打破。看看API doc of the ListView

在ListView上調用setReuseItems()解決了這個問題。

問候, 伯特