wicket:如何组合CompoundPropertyModel和LoadableDetachableModel

时间:2013-11-25 12:50:20

标签: wicket wicket-1.5 wicket-1.6

我想实现两个目标:

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

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

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

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

    2. 我应该new CompoundPropertyModel(myLoadableDetachableModel)吗?

1 个答案:

答案 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();
    }
}