2014-11-14 75 views
1

我是apache wicket中的新成員,我不明白爲什麼我們要獲取對象的模型。例如,爲了保存提交的輸入,我們在網頁的表單組件中獲得了我們的Class Movie模型; 在apache wicket中獲取對象模型的原因是什麼?

CompoundPropertyModel model = new CompoundPropertyModel(movie); this.setModel(model); this.add(new TextField("title")); this.add(new TextField("year")); 
代碼繼續;

@Override 
public void onSubmit() { 
    Movie movie = (Movie) this.getModelObject(); 
    WicketApplication app = (WicketApplication) this.getApplication(); 
    MovieCollection collection = app.getCollection(); 
    collection.addMovie(movie); 
    this.setResponsePage(new MovieDisplayPage(movie)); 
} 
+3

我想你用你的例子回答了這個問題:textfields不需要知道關於信息如何保存的任何信息,他們只是使用compoundpropertymodel。有關wicket模型的更多信息,請閱讀:http://wicket.apache.org/guide/guide/modelsforms.html – thg

+0

因此,我們將表單組件的模型提供給類,並以某種方式匹配它們的數據。我想我明白了。感謝您的評論和鏈接。 – ninbit

回答

0

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 TextFieldnull模型將查找組件層次結構,以查看是否存在具有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。

相關問題