0

リスト内の要素の位置を変更したい。しかし、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」の要素からスワップされた順序ではありません。

4

1 に答える 1

0

あなたのリストは LoadableDetachableModel からロードされていると言います。クエリ結果のアイテムを交換しているように見えますが、DB を更新していないため、次回 Wicket が ListView をレンダリングするときに、DB に新しい呼び出しを行い、古い状態を (再) ロードします。

于 2015-04-10T06:15:25.787 に答える