1

我有一个模型可以描述如下:

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

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

我已经解决了所有持久性问题,现在我正在尝试创建一个表单,用户应该能够在其中创建这些类(狗和猫)的对象。

我希望它看起来大致如下:

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

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

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

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

4

1 回答 1

2

首先,您应该考虑将动物类型选择与表单的其余部分分开,因为如果用户在输入一些数据后决定更改类型,您将需要丢弃一些条目。这可以通过 ajaxifying 表单的这一部分并使用 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 的完整性...

于 2013-07-15T09:57:42.350 回答