ListView中的交换元素不会更新模型

时间:2015-04-09 13:50:01

标签: java ajax wicket-6

我想更改列表中元素的位置。但每当我交换两个元素时,模型似乎都没有更新,并且DAO.update没有进行我期望的更新。

数据库表中的样本(之前):

 ----------------------
| ID | NAME | POSITION |
 ----------------------
|1194| x    | 1        |
|1195| y    | 2        |
|1196| z    | 3        |
 ----------------------

数据库表中的样本(提交表单后交换):

左:错,正如我的代码所做的那样; 对:我期望/需要的(名称和ID不变)

 ----------------------    ----------------------
| ID | NAME | POSITION |  | ID | NAME | POSITION |
 ----------------------    ----------------------
|1194| y    | 1        |  |1194| x    | 2        |
|1195| x    | 2        |  |1195| y    | 1        |
|1196| z    | 3        |  |1196| z    | 3        |
 ----------------------    ----------------------

我已经从ListView覆盖了moveDownLink,并在最后添加了一个AJAX调用。

我的ChangableListView的一部分(扩展ListView):

public final AjaxSubmitLink moveDownLink(final String id, final ListItem<T> item, Form form) {

    @Override
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
        final int index = getList().indexOf(item.getModelObject());
        if (index != -1) {
            addStateChange();

            Collections.swap(getList(), index, index + 1);
            ChangableListView.this.removeAll();
        }
        target.add(form);
    }
}

在ListView和ListView中使用moveDownLink:

final ListView<MyType> groupView = new ChangableListView<MyType>("groups", groupModel = new MyTypeListModel()) {
    @Override
    protected void populateItem(final ListItem<MyType> item) {
       item.setModel(new CompoundPropertyModel<MyType>(item.getModel()));

       AjaxSubmitLink downLink = moveDownLink("moveDown", item, form);
       item.add(downLink.isEnabled() ? downLink : new Label("moveDown", ""));

       item.add(new Label("name"));                            
    }
};
form.add(groupView);

提示:MyTypeListModel扩展LoadableDetachableModel(LDM)并覆盖其load()签名。所有条目都已正确加载并附加到LDM。

在Form.onSubmit()中更新的一部分:

for (int i = 0; i < ((List<MyType>) groupModel.getObject()).size(); i++) {
     MyType group = ((List<MyType>) groupModel.getObject()).get(i);
     // set new order
     group.setHPosition(i + 1);

     dao.update(group);
}

问题:调用moveDownLink / onSubmit()之后,groupModel.getObject()似乎保留了LDM.load()的原始值,而不是来自&#34;的元素的交换顺序。 1194&#34;和&#34; 1195&#34;。

1 个答案:

答案 0 :(得分:0)

您说您的列表是从LoadableDetachableModel加载的。 在我看来,您正在交换查询结果的项目,但是您没有更新数据库,因此下次Wicket呈现ListView时,它会对数据库进行新的调用并(重新)加载旧状态。