0

我想更改列表中元素的位置。但是每当我交换两个元素时,模型似乎没有更新,并且 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 和 Form 中的 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() 的原始值,而不是“1194”和“1195”元素的交换顺序。

4

1 回答 1

0

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

于 2015-04-10T06:15:25.787 回答