我想更改列表中元素的位置。但是每当我交换两个元素时,模型似乎没有更新,并且 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”元素的交换顺序。