我的模型可以描述如下:
http://aoeu.se/so/animal-dog-cat.png
(非常简化。我的实际课程每个都有大约十二十个字段。)
我的持久性已经完成,我现在正在尝试创建一个表单,用户应该能够创建这些类的对象(狗和猫)。
我希望它大致如下:
http://aoeu.se/so/new-animal-form.png
(我已经实现了HTML和启用/禁用输入字段。)
致我的问题:如何最好地实施表单处理?我不知道如何直接使用PropertyModels等,因为模型对象的类型取决于第一个Dog / Cat选择。
如果Wicket保证处理字段的顺序与它们在网页中出现的顺序相同,那么我想我可以在处理动物类型输入后创建模型对象(因为它是第一个表单组件),让剩下的字段使用PropertyModel。
答案 0 :(得分:2)
首先,您应该考虑将动物类型选择与表单的其余部分分开,因为如果用户在输入某些数据后决定更改类型,则需要丢弃一些条目。这可以通过激活表单的这一部分并使用onChange事件来清理数据并切换模型来实现。
执行此操作时,您可能需要考虑从继承切换到合成以避免复制数据。我不知道这是否仍与您的持久性策略兼容,但您可以将完成的数据复制到持久层。
例如,当您的CatModel不从AnimalModel继承而是包含类似这样的AnimalModel时:
public class CatModel {
private final AnimalModel parent;
private String meowingSound;
public CatModel(AnimalModel parent) {
this.parent = parent;
}
public int getNumLegs() {
return parent.getNumLegs();
}
public void setNumLegs(int numLegs) {
parent.setNumLegs(numLegs);
}
public String getMeowingSound() {
return meowingSound;
}
public void setMeowingSound(String meowingSound) {
this.meowingSound = meowingSound;
}
public AnimalModel getParent() {
return parent;
}
}
(跳过界面)
您可以从(同样构建的)DogModel中获取AnimalModel来初始化CatModels的继承数据。
public class AnimalModel {
private int numLegs;
public int getNumLegs() {
return numLegs;
}
public void setNumLegs(int numLegs) {
this.numLegs = numLegs;
}
}
AnimalModel的完整性......