我有一个域对象,它有一组原始值,表示另一个域对象(“Person”)的主键。
我有一个Wicket组件,它接受IModel< List< Person>>,并允许您查看,删除和添加人员到列表中。
我想编写一个实现IModel< List< Person>>的包装器,但它由PropertyModel< List< Long>>支持。来自原始域对象。
仅查看很简单(Scala语法简洁):
class PersonModel(wrappedModel: IModel[List[Long]]) extends LoadableDetachableModel[List[Person]] {
@SpringBean dao: PersonDao =_
def load: List[Person] = {
// Returns a collection of Persons for each id
wrappedModel.getObject().map { id: Long =>
dao.getPerson(id)
}
}
}
但是我怎么写这个以允许添加和删除原来的Longs列表?
或者模型不是进行此翻译的最佳位置?
谢谢!
答案 0 :(得分:1)
您可以这样做:
class PersonModel extends Model<List<Person>> {
private transient List<Person> cache;
private IModel<List<String>> idModel;
public PersonModel( IModel<List<String>> idModel ) {
this.idModel = idModel;
}
public List<Person> getObject() {
if ( cache == null ) {
cache = convertIdsToPersons( idModel.getObject() );
return cache;
}
public void setObject( List<Person> ob ) {
cache = null;
idModel.setObject( convertPersonsToIds( ob ) );
}
}
这不是很好的代码,但它显示了一般的想法。您需要考虑的一件事是如何在请求之间序列化整个事件,您可能最好更好地扩展LoadableDetachableModel
。
另一件事是缓存:它是为了避免每次在请求中调用getObject()
时转换列表。您在实践中可能需要也可能不需要它(取决于很多因素,包括转换速度),但如果您使用它,则意味着如果其他内容正在修改基础集合,则可能无法获取更改通过这种模式。
答案 1 :(得分:0)
我不太确定我理解你的问题而且我不理解Scala的语法。
但是,要从列表中删除实体,您可以提供一个只需使用您的dao删除它的链接。您必须使用转发器填充您的人员列表,以便每个转发器条目都有自己的模型,可以将其传递给删除链接。
请查看此Wicket example,它使用与转发器的链接来选择联系人。你只需要调整它来删除你的人而不是选择它。
至于修改Longs的原始列表,您可以使用ListView.removeLink()
方法获取一个链接组件,从后备列表中删除一个条目。