Wicket ListView не обновляется - PullRequest
2 голосов
/ 04 декабря 2010

Я делаю первые шаги с Apache Wicket и столкнулся со следующей проблемой.У меня есть ListView, который отображает ссылку «удалить» прямо рядом с его записями.При нажатии на ссылку удаления объект, представленный элементом списка, удаляется из базы данных, но сам список не обновляется, пока я не перезагрузлю страницу вручную в браузере.

IModel<List<SampleEntity>> sampleEntityListModel = new LoadableDetachableModel<List<SampleEntity>>() {
        @Override
        protected List<SampleEntity> load() {
            return mSampleEntityBA.findAll();
        }
    };

mListview = new ListView<SampleEntity>("listview", sampleEntityListModel) {
        @Override
        protected void populateItem(final ListItem<SampleEntity> item) {
            item.add(new Label("listlabel", new PropertyModel<String>(item.getModelObject(),
                    "text")));
            item.add(new Link<SampleEntity>("deleteLink", item.getModel()) {
                @Override
                public void onClick() {
                    mSampleEntityBA.delete(item.getModelObject());
                }
            });
        }
};

Ответы [ 4 ]

3 голосов
/ 14 декабря 2010

Когда вызывается onClick, item.getModelObject () извлекает из sampleEntityListModel, который, в свою очередь, вызывает mSampleEntityBA.findAll (). Объект модели sampleEntityListModel будет храниться в кэше в течение всего цикла запроса (пока он не будет отсоединен - ​​как правило, это то, что вам нужно) и не будет знать о вызове delete ().

Чтобы обновить sampleEntityListModel, добавьте вызов sampleEntityListModel.detach () сразу после удаления (sampleEntityListModel должно быть сделано окончательным, но это не приведет к сериализации какого-либо дополнительного состояния). Это приведет к тому, что модель извлечет новый набор данных, когда представление списка будет отображаться позже в цикле запроса.

0 голосов
/ 04 декабря 2010

похоже, проблема в том, что ваш mSampleEntityBA.findAll ();возвращает неверные данные.трудно помочь, не видя больше кода.

в другой заметке, вы действительно должны использовать DataView при работе со списками, поддерживаемыми базой данных.

0 голосов
/ 06 декабря 2010

Вы также можете использовать JQGrid из проекта wiQuery вместо DataView.

0 голосов
/ 04 декабря 2010

Вы, вероятно, захотите AjaxLink вместо этой ссылки, а затем вам придется обновить список, используя тактику, описанную здесь , возможно, немного скорректировав для того факта, что в вики вместо кода Wicket 1.3из 1.4.

Но вам может быть лучше использовать другой повторитель, такой как RefreshingView или DataView.Вот несколько примеров различных ретрансляторов здесь .Хотя ни один из них не является именно тем, что вы ищете, просмотр этого кода может помочь.

...