CompoundPropertyModel
是一個有爭議的模型,至少可以說。它看起來像魔術一樣工作,並有一些無法預料的語義。
的CompoundPropertyModel
的Javadoc,告訴它一切真的:
/**
* A simple compound model which uses the component's name as the property expression to retrieve
* properties on the nested model object.
*
* CompoundPropertyModel is a chaining model so it will call get/setobject on the given object if
* the object is an instanceof IModel itself.
*
* @see org.apache.wicket.model.IModel
* @see org.apache.wicket.model.Model
* @see org.apache.wicket.model.LoadableDetachableModel
* @see IChainingModel
*
* @author Jonathan Locke
*
* @param <T>
* The model object type
*/
public class CompoundPropertyModel<T> extends ChainingModel<T> implements IComponentInheritedModel<T>
神奇坐在財產路徑的分辨率。 A TextField
與null
模型將查找組件層次結構,以查看是否存在具有IComponentInheritedModel
(該CompoundPropertyModel實現)的父級。如果是這樣,它將使用它根據CompoundPropertyModel(最內部)對象的根目錄評估組件標識符爲屬性表達式。
這樣你就可以做這樣的事情:
setModel(new CompoundPropertyModel(person));
add(new TextField("spouse.familyName"));
add(new TextField("children[0].age"));
很整齊,但也算神奇。
危險在於下面的一段代碼:
setModel(new CompoundPropertyModel(person));
add(new TextField("spouse.familyName"));
add(new TextField("children[0].age"));
add(new Link<Person>("delete") {
@Override
public void onClick() {
Person p = getModelObject();
if(p.isUnderage()) {
p.delete();
}
}
});
當鏈接獲取其模型對象,它會引發人的delete()
方法之前年齡檢查下。所以要注意CompoundPropertyModel。
我想你用你的例子回答了這個問題:textfields不需要知道關於信息如何保存的任何信息,他們只是使用compoundpropertymodel。有關wicket模型的更多信息,請閱讀:http://wicket.apache.org/guide/guide/modelsforms.html – thg
因此,我們將表單組件的模型提供給類,並以某種方式匹配它們的數據。我想我明白了。感謝您的評論和鏈接。 – ninbit