我想实现两个目标:
我希望我的模型在生命周期中每次都从数据库加载(对于每个请求,只有一个对数据库的请求)
我希望我的模型能够动态附加到页面上,并且检票口将为我完成所有这些可操作的绑定
为了实现这两个目标,我得出一个结论,我需要同时使用CompoundPropertyModel
和LoadableDetachableModel
。
有谁知道这是否是一个好方法?
我应该这样做
new CompoundPropertyModel(myLoadableDetachableModel)
吗?
我想实现两个目标:
我希望我的模型在生命周期中每次都从数据库加载(对于每个请求,只有一个对数据库的请求)
我希望我的模型能够动态附加到页面上,并且检票口将为我完成所有这些可操作的绑定
为了实现这两个目标,我得出一个结论,我需要同时使用CompoundPropertyModel
和LoadableDetachableModel
。
有谁知道这是否是一个好方法?
我应该这样做new CompoundPropertyModel(myLoadableDetachableModel)
吗?
是的,你是对的,可以使用
new CompoundPropertyModel<T>(new LoadableDetachableModel<T> { ... })
或使用静态创建(它也一样):
CompoundPropertyModel.of(new LoadableDetachableModel<T> { ... })
兼具复合模型和惰性可拆卸模型的特点。分离也可以正常工作,当它分离 CompoudPropertyModel 时,它也代理分离到在这种情况下用作模型对象的内部模型。
我在很多情况下都使用它并且效果很好。
说明: 查看 CompoundPropertyModel 类的外观(我现在正在谈论 Wicket 1.6):
公共类 CompoundPropertyModel<T> 扩展了 ChainingModel<T>
这意味着,CompoundPropertyModel 将属性表达式行为添加到 ChainingModel。
ChainingModel 具有以下字段“目标”和设置它的构造函数。
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();
}
}