Использование 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();
  }
}
Другие вопросы по тегам