Wicket模型的面板到面板的模型

时间:2017-05-01 19:10:26

标签: java wicket

我在wicket模型中有一个问题。由于公司的隐私,不能记下所有代码,我认为只有一部分是重要的。我的POJO java类是。期间是2个LocalDates类型的objets。

Class MyClass {
   private List<Period> periods = new ArrayList<>();

   public void setPeriods(List<Periods> periods) {
       this.periods = periods;
   }

   public List<Period> getPeriods() {
       return this.periods;
   }
}

对于List,我有一个带dataTable的特殊面板,允许添加和删除句点。

Class MyPanel extends Panel {
    public MyPanel(String id, IModel<List<Period>> model) {
        super(id, model);
    }

    void onInitialize() {
        Form<List<Period>> form = new Form<>("myPeriodsForm", model);
        rebuildTable(form, null); // here is the code for dataTable building and updating via ajax(here is null).          
    }
}

我使用基于MyClass POJO的模型创建webPage,并将此模型插入到表单中。

CompoundPropertyModel propertyModel = new CompoundPropertyModel(getModel());
Form<MyClass> form = new Form<>("myForm", propertyModel);
form.add(new MyPanel("myPanel", propertyModel.bind("periods")));
form.add(new AjaxLinkButton("save", this::store));

....

private MyClass getObject() {
    return form.getModelObject();
}

private void store(AjaxRequestTarget target, Form<?> form) {
    myClassService.save(getObjetct()); // here is myClassService is autowired Spring Bean which storing object in database;
}

当我创建没有空列表期的WebPage时,我可以在dataTable中看到日期,我可以添加新的期间,可以删除期间。我做了调试,看到面板中的模型显示了我已添加的所有时段,因此应该正常工作。但是,当我尝试保存对象时,通过单击“保存”按钮,然后form.getModelObject()返回空List,即使插入时对象没有为空。

我试图将模型插入更改为我写的面板:

    CompoundPropertyModel propertyModel = new CompoundPropertyModel(getModel());
    Form<MyClass> form = new Form<>("myForm", propertyModel);
    form.add(new MyPanel("myPanel", new CompoundPropertyModel(form.getModelObject().getPeriods())));// you see there now I'm getting List<> and creating compound model
    form.add(new AjaxLinkButton("save", this::store));

现在点击ob保存按钮它可以从面板中获取所有期间。 我无法理解为什么会这样。

我意识到在某些时刻面板上发生了updateModel(),并且通过FormComponent类中的wicket代码:

public void updateModel() {
    this.setModelObject(this.getConvertedInput());
}

所以,我已经覆盖了updateModel方法:

@Override
public void updateModel() {
    setConvertedInput(getModelObject());
    super.updateModel();
}

这意味着当面板和模板的模型发生变化时,convertedInput不会改变。

我现在知道为什么调用了updateModel,我在这里写了AjaxLinkBut​​ton,但实际上在代码中使用我们自己的按钮,它扩展了AjaxButton并提交表单。

0 个答案:

没有答案