Использование DataView в качестве таблицы результатов динамического поиска в Wicket 1.4
Я довольно новичок в Wicket, но уже столкнулся с очень странной проблемой.
Я создаю страницу с довольно простой формой поиска и таблицей результатов (DataView), которая изначально пуста. Когда пользователь вводит данные в поля и нажимает кнопку "Поиск", приложение вызывает некоторые внутренние службы, которые затем используются для заполнения DataView.
Однако пользователь должен дважды щелкнуть "Поиск" для отображения данных.
Я наконец отследил это, и это потому, что Wicket использует ноль для количества элементов, которые будут отображаться для первого клика "Поиск". При втором щелчке строки уже были добавлены, и Wicket уже рассчитала правильное количество отображаемых строк, поэтому она решает, что покажет данные.
В AbstractPageableView.getItemModels () размер отображаемых результатов изначально равен нулю, потому что я, вероятно, не загружаю таблицу с какими-либо начальными данными.
Я справился с этой проблемой, загрузив DataView с пустыми строками при загрузке страницы. Похоже, это обманывает DataView, используя отображение данных для первого клика "Поиск".
Мой вопрос: я делаю это правильно? Есть ли другой репитер, который лучше подходит для этой задачи? Это ошибка или что-то?
1 ответ
В конце концов это удалось: это произошло потому, что я загружал данные в свой провайдер данных только в методе iterator (), а метод size() провайдера данных обычно вызывается раньше, чем метод iterator (). Я должен был загружать данные в свой собственный метод и вызывать этот метод из iterator () и size(). Делать это исправило это.
Поставщик данных до (Splc является DTO):
SearchResultsDataProvider implements IDataProvider<Splc> {
/**
* The list of search results
*/
private List<Splc> models;
@Override
public void detach() {
// Do nothing
}
@Override
public Iterator<Splc> iterator(int first, int count) {
// load the data into the list of models
models = service.getSplcModels();
return models.subList(....).iterator();
}
@Override
public IModel<Splc> model(Splc object) {
return new Model<Splc>(object);
}
@Override
public int size() {
return models.size();
}
}
Поставщик данных после:
SearchResultsDataProvider implements IDataProvider<Splc> {
private List<Splc> getModels() {
// load the data into the list of models
return service.getSplcModels();
}
@Override
public void detach() {
// Do nothing
}
@Override
public Iterator<Splc> iterator(int first, int count) {
return getModels().subList(....).iterator();
}
@Override
public IModel<Splc> model(Splc object) {
return new Model<Splc>(object);
}
@Override
public int size() {
return getModels().size();
}
}