Wicket - Wrapped collection模型“转型”

时间:2011-11-30 04:03:21

标签: wicket

我有一个域对象,它有一组原始值,表示另一个域对象(“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列表?

或者模型不是进行此翻译的最佳位置?

谢谢!

2 个答案:

答案 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()方法获取一个链接组件,从后备列表中删除一个条目。