使用继承进行表单处理

时间:2013-07-15 07:41:45

标签: forms inheritance wicket

我的模型可以描述如下:

http://aoeu.se/so/animal-dog-cat.png

(非常简化。我的实际课程每个都有大约十二十个字段。)

我的持久性已经完成,我现在正在尝试创建一个表单,用户应该能够创建这些类的对象(狗和猫)。

我希望它大致如下:

http://aoeu.se/so/new-animal-form.png

(我已经实现了HTML和启用/禁用输入字段。)

我的问题:如何最好地实施表单处理?我不知道如何直接使用PropertyModels等,因为模型对象的类型取决于第一个Dog / Cat选择。

如果Wicket保证处理字段的顺序与它们在网页中出现的顺序相同,那么我想我可以在处理动物类型输入后创建模型对象(因为它是第一个表单组件),让剩下的字段使用PropertyModel。

1 个答案:

答案 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的完整性......