模型链接/"bridging" 将多级结构读取为平面
Model chaining/"bridging" to read Multi-level structure as planar
假设如下多级结构:
class Habitation {
private House house;
private List<Habitant> habitants;
}
此对象需要以平面形式显示在 ListView 中的每个居民(这就是为什么多级对象需要以平面形式表示),如下所示:
| habitant.name | house.address |
| ... | ... |
我认为这样做是正确的:创建一个 "bridging"/chaining 对象,如下所示:
class PlanarHabitant {
private IModel<House> house;
private IModel<Habitant> habitant;
}
此桥接对象是从 Habitation
对象创建的,如下所示:
//Habitation.expand()
public List<PlanarHabitant> expand() {
List<PlanarHabitant> res = new ArrayList<PlanarHabitant>();
for (Habitant habitant : this.habitants) {
PlanarHabitant ph = new PlanarHabitant();
ph.setHouse(Model.of(this.house));
ph.setHabitant(Model.of(habitant));
res.add(ph);
}
return res;
}
并且这个数据显示在ListView中。它是这样完成的:
final IModel<List<PlanarHabitant>> model = (IModel<List<PlanarHabitant>>) this.getDefaultModel();//model assigned is Model.ofList(Habitation.expand())
this.importList = new ListView<PlanarHabitant>("habitants", model) {
@Override
protected void populateItem(final ListItem<PlanarHabitant> item) {
item.add(new Label("cn", new PropertyModel(item.getModel(), "habitant.name")));
}
};
问题是标签模型总是给出字段不存在的异常。
我试图将 CompoundPropertyModel
(和其他)分配给 PlanarHabitant
和不同的路径表达式,但没有任何效果。
我只是使用了错误的模型和路径表达式组合,还是完全错误的方法?
多层结构不应转换为平面结构的原因是它需要保存,PlanarHabitant
中 House 的重复将在 DB 中创建重复,这不应该发生。
您正在构建嵌套对象的层次结构,模型介于两者之间:
Model
⟶ List<PlanarHabitant>
⟶* PlanarHabitant
⟶ Model<House>
⟶ House
⟶ Model<Habitant>
⟶ Habitant
每个 ListView
的项目都有一个 Model<PlanarHabitant>
(自动为您创建),因此您的 属性 表达式必须是 "habitant.object.name"
.
当然最好跳过嵌套模型:
class PlanarHabitant {
private House house;
private Habitant habitant;
}
通常,当您看到 non-Wicket 个对象(既没有组件也没有模型本身)持有对模型的引用时,就会出现问题。
假设如下多级结构:
class Habitation {
private House house;
private List<Habitant> habitants;
}
此对象需要以平面形式显示在 ListView 中的每个居民(这就是为什么多级对象需要以平面形式表示),如下所示:
| habitant.name | house.address |
| ... | ... |
我认为这样做是正确的:创建一个 "bridging"/chaining 对象,如下所示:
class PlanarHabitant {
private IModel<House> house;
private IModel<Habitant> habitant;
}
此桥接对象是从 Habitation
对象创建的,如下所示:
//Habitation.expand()
public List<PlanarHabitant> expand() {
List<PlanarHabitant> res = new ArrayList<PlanarHabitant>();
for (Habitant habitant : this.habitants) {
PlanarHabitant ph = new PlanarHabitant();
ph.setHouse(Model.of(this.house));
ph.setHabitant(Model.of(habitant));
res.add(ph);
}
return res;
}
并且这个数据显示在ListView中。它是这样完成的:
final IModel<List<PlanarHabitant>> model = (IModel<List<PlanarHabitant>>) this.getDefaultModel();//model assigned is Model.ofList(Habitation.expand())
this.importList = new ListView<PlanarHabitant>("habitants", model) {
@Override
protected void populateItem(final ListItem<PlanarHabitant> item) {
item.add(new Label("cn", new PropertyModel(item.getModel(), "habitant.name")));
}
};
问题是标签模型总是给出字段不存在的异常。
我试图将 CompoundPropertyModel
(和其他)分配给 PlanarHabitant
和不同的路径表达式,但没有任何效果。
我只是使用了错误的模型和路径表达式组合,还是完全错误的方法?
多层结构不应转换为平面结构的原因是它需要保存,PlanarHabitant
中 House 的重复将在 DB 中创建重复,这不应该发生。
您正在构建嵌套对象的层次结构,模型介于两者之间:
Model
⟶ List<PlanarHabitant>
⟶* PlanarHabitant
⟶ Model<House>
⟶ House
⟶ Model<Habitant>
⟶ Habitant
每个 ListView
的项目都有一个 Model<PlanarHabitant>
(自动为您创建),因此您的 属性 表达式必须是 "habitant.object.name"
.
当然最好跳过嵌套模型:
class PlanarHabitant {
private House house;
private Habitant habitant;
}
通常,当您看到 non-Wicket 个对象(既没有组件也没有模型本身)持有对模型的引用时,就会出现问题。