【问题标题】:When is the load of a detachableloadablemodel called in java wicket?java wicket中何时调用可拆卸可加载模型的负载?
【发布时间】:2014-01-08 09:23:37
【问题描述】:

在我的代码中,我有如下内容:

检票口形式:

public class MyForm extends Form<MyFormModel> {
    public MyForm(String id){
        super(id, new CompoundPropertyModel<MyFormModel>(new MyFormModel())

        //add some labels from the CompoundPropertyModel

    }

    @Override
    protected void onSubmit() {

        setResponsePage(new NewPage(getModelObject()));

    }
}

表单模型:

public class MyFormModel extends LoadableDetachableModel<List<NotSerializableObject>> {

    transient List<NotSerializableObject> list;

    //Some labels with getters and setters for CompoundPropertyModel use

    protected List<NotSerializableObject> load() {
        //list = dbstuff.getstuff()
    } 
}

当页面加载了MyForm 时,MyFormModel 使用load() 函数并在提交表单之前尝试访问数据库。我不明白为什么,因为在提交表单并调用onSubmit() 之前不会调用getModelObject()

我知道 CompoundPropertyModel 和 LoadableDetachableModel 应该分开来解决这个问题,但为什么这不起作用?为什么以及从哪里调用 load() 函数?

感谢您的帮助,

马丁

【问题讨论】:

    标签: java wicket


    【解决方案1】:

    当显示 Form 时,每个 FormComponent 都会向其 Model 询问值。对 getModelObject() 的第一次调用(在我的脑海中,最近没有做太多检票口)被链接到 LoadableDetacheableModel 中的 load()。

    【讨论】:

      【解决方案2】:

      看起来有一个组件添加到 MyForm(您的代码 sn-p 省略了那部分代码)。如果任何 MyForm 组件访问模型,则调用 getModel().getObject() -> load()。请记住,CompoundPropertyModel 也在内部模型上使用 getObject()。

      【讨论】:

      • 我添加了一些文本字段,如下所示:add(new TextField&lt;String&gt;("compoundPropertyVar"));。但是我在调​​试的时候,在添加这些TextFields的时候并没有输入load()这个函数。当有多个 TextField 时,它也只进入函数一次,因此不会为每个属性调用 getObject()
      • TextField 组件通过调用 load() 的属性模型(或 CompoundPropertyModel)调用 getObject()。这就是原因。
      • 调用是在组件和每个请求的生命周期中的某个地方。
      猜你喜欢
      • 1970-01-01
      • 2011-07-26
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 2014-01-10
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多