2013-07-15 47 views
1

表单处理我有一个可以描述的模型如下:与继承

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

(极度简化我的实际类有左右各一零二零年更多的领域。)

我有持久性全部解决了,我现在试图创建一个表单,用户应该能够创建这些类(狗和猫)的对象。

我想它大致如下所示:(我已经有HTML和实​​施输入字段的启用/禁用)

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

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

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

+1

您可以通过Ajaxifying它并使用onChange事件来切换形模型分开的形式存在,例如其余的动物类型选择一个符合所选类型(在需要的地方复制数据)... – Nicktar

+0

没错。那将是另一种选择。虽然会有很多复制。但也许这是最好的解决方案。 – aioobe

+0

如果你想为模型使用组合(比如CatModel和DogModel都包含AnimalModel和委托方法),你可以将“继承”部分移动... – Nicktar

回答

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; 
    } 

} 

(接口跳过)

你可以采取AnimalModel从(同样构造)DogModel初始化您的CatModels'继承的'数据。

public class AnimalModel { 

    private int numLegs; 

    public int getNumLegs() { 
     return numLegs; 
    } 

    public void setNumLegs(int numLegs) { 
     this.numLegs = numLegs; 
    } 
} 

AnimalModel为了完整性......

+0

我的模型类有很多虚拟方法和依赖于继承的内部类,所以更改为合成不幸是不是一种选择。 (除非你在谈论一些辅助类,但是我将不得不在两个不同的类中复制每个字段。) – aioobe

+0

我认为你必须坚持复制。我们有意使用非常不同类型的模型。对我来说,一个模型(对于wicket而言)只不过是一个数据容器。一些成员,getter,setter,可能有些代码可以与daos,equals,hashCode进行交谈,而这对大多数情况来说都是如此。 – Nicktar

+0

在我决定创建一个Web前端之前,我很早就设计了这些类,并且我不愿意切换到[贫血域模型](http://en.wikipedia.org/wiki/Anemic_domain_model)。 – aioobe