2

我想实现两个目标:

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

  2. 我希望我的模型能够动态附加到页面上,并且检票口将为我完成所有这些可操作的绑定

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

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

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

4

1 回答 1

5

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

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();
    }
}
于 2013-11-25T21:15:14.270 回答