我想更改列表中元素的位置。但每当我交换两个元素时,模型似乎都没有更新,并且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;。
答案 0 :(得分:0)
您说您的列表是从LoadableDetachableModel加载的。 在我看来,您正在交换查询结果的项目,但是您没有更新数据库,因此下次Wicket呈现ListView时,它会对数据库进行新的调用并(重新)加载旧状态。