wicket:如何组合CompoundPropertyModel和LoadableDetachableModel

yoa*_*str 2 wicket wicket-1.5 wicket-1.6

我想实现两个目标:

  1. 我希望我的模型每次都可以从DB中加载到生命周期中(对于每个请求,只有一个请求到DB)

  2. 我希望我的模型能够动态地附加到页面上,而wicket将为我完成所有这些重要的绑定

为了实现这两个目标,我得出结论,我需要同时使用CompoundPropertyModelLoadableDetachableModel.

  1. 有谁知道这是一个好方法吗?

  2. 我该new CompoundPropertyModel(myLoadableDetachableModel)怎么办?

Mar*_*ejc 5

是的,你是对的,可以使用

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)