我想实现两个目标:
我希望我的模型每次都可以从数据库中加载到生命周期中(对于每个请求,只有一个请求到数据库)
我希望我的模型动态地附加到页面上,而wicket将为我做所有这些重要的绑定
为了实现这两个目标,我得出结论,我需要同时使用CompoundPropertyModel
和LoadableDetachableModel
。
有谁知道这是一个好方法吗?
我应该new CompoundPropertyModel(myLoadableDetachableModel)
吗?
答案 0 :(得分:5)
是的,你是对的,可以使用
new CompoundPropertyModel<T>(new LoadableDetachableModel<T> { ... })
或使用静态创建(它也是如此):
CompoundPropertyModel.of(new LoadableDetachableModel<T> { ... })
具有复合模型和延迟可拆卸模型的两个特征。分离工作也正常,当它分离CompoudPropertyModel时,它也代理分离到在这种情况下用作模型对象的内部模型。
我在很多情况下使用它并且工作正常。
<强>说明:强> 看看CompoundPropertyModel类看起来如何(我现在正在谈论Wicket 1.6):
公共类CompoundPropertyModel&lt; T&gt;扩展ChainingModel&lt; T&gt;
这意味着,CompoundPropertyModel将属性表达式行为添加到ChainingModel。
ChainingModel具有以下字段'target'和用于设置它的构造函数。
private Object target;
public ChainingModel(final Object modelObject)
{
...
target = modelObject;
}
这将对目标或模型进行“目标”引用。
当你调用getObject()时,如果目标是IModel的子类,它会检查目标并代理功能:
public T getObject()
{
if (target instanceof IModel)
{
return ((IModel<T>)target).getObject();
}
return (T)target;
}
为setObject(T)实现了类似的功能,如果目标是IModel的子类,它也设置目标或代理它
public void setObject(T object)
{
if (target instanceof IModel)
{
((IModel<T>)target).setObject(object);
}
else
{
target = object;
}
}
同样的方法用于分离对象,但它检查目标(模型对象)是否可拆卸,换句话说,如果目标是IDetachable的子类,那么任何IModel都是。
public void detach()
{
// Detach nested object if it's a detachable
if (target instanceof IDetachable)
{
((IDetachable)target).detach();
}
}