yoa*_*str 2 wicket wicket-1.5 wicket-1.6
我想实现两个目标:
我希望我的模型每次都可以从DB中加载到生命周期中(对于每个请求,只有一个请求到DB)
我希望我的模型能够动态地附加到页面上,而wicket将为我完成所有这些重要的绑定
为了实现这两个目标,我得出结论,我需要同时使用CompoundPropertyModel和LoadableDetachableModel.
有谁知道这是一个好方法吗?
我该new CompoundPropertyModel(myLoadableDetachableModel)怎么办?
是的,你是对的,可以使用
new CompoundPropertyModel<T>(new LoadableDetachableModel<T> { ... })
Run Code Online (Sandbox Code Playgroud)
或者使用静态创建(它也是这样):
CompoundPropertyModel.of(new LoadableDetachableModel<T> { ... })
Run Code Online (Sandbox Code Playgroud)
具有复合模型和惰性可拆卸模型的特征.分离工作也正确,当它分离CompoudPropertyModel时,它也代理分离到在这种情况下用作模型对象的内部模型.
我在很多情况下使用它,它工作正常.
解释: 看看看看CompoundPropertyModel类(我现在正在谈论Wicket 1.6):
public class CompoundPropertyModel <T>扩展ChainingModel <T>
这意味着,CompoundPropertyModel将属性表达式行为添加到ChainingModel.
ChainingModel具有以下字段'target'和用于设置它的构造函数.
private Object target;
public ChainingModel(final Object modelObject)
{
...
target = modelObject;
}
Run Code Online (Sandbox Code Playgroud)
这将对目标或模型进行"目标"引用.
当你调用getObject()时,如果目标是IModel的子类,它会检查目标并代理功能:
public T getObject()
{
if (target instanceof IModel)
{
return ((IModel<T>)target).getObject();
}
return (T)target;
}
Run Code Online (Sandbox Code Playgroud)
类似的功能是针对setObject(T)实现的,如果目标是IModel的子类,它也设置目标或代理它
public void setObject(T object)
{
if (target instanceof IModel)
{
((IModel<T>)target).setObject(object);
}
else
{
target = object;
}
}
Run Code Online (Sandbox Code Playgroud)
同样的方法用于分离对象,但它检查目标(模型对象)是否可拆卸,换句话说,如果目标是IDetachable的子类,那么任何IModel都是.
public void detach()
{
// Detach nested object if it's a detachable
if (target instanceof IDetachable)
{
((IDetachable)target).detach();
}
}
Run Code Online (Sandbox Code Playgroud)