リスト内の要素の位置を変更したい。しかし、2 つの要素を交換するたびに、モデルが更新されていないように見え、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() からの元の値を保持しているように見えますが、「1194」および「1195」の要素からスワップされた順序ではありません。