Использование DataView в качестве динамической таблицы результатов поиска в Wicket 1.4 - PullRequest
0 голосов
/ 25 августа 2011

Я довольно новичок в Wicket, но я уже столкнулся с очень странной проблемой.

Я создаю страницу с довольно простой формой поиска и таблицей результатов (DataView), которая изначально пуста. Когда пользователь вводит данные в поля и нажимает «Поиск», приложение вызывает некоторые внутренние службы, которые затем используются для заполнения DataView.

Однако пользователь должен дважды щелкнуть «Поиск» для отображения данных.

Я наконец отследил это, и это потому, что Wicket использует ноль для количества элементов, которые будут отображаться при первом клике "Поиск". При втором щелчке строки уже добавлены, и Wicket уже рассчитала правильное количество отображаемых строк, поэтому она решает, что покажет данные.

В AbstractPageableView.getItemModels () размер отображаемых результатов изначально равен нулю, потому что я не загружаю таблицу с какими-либо начальными данными, вероятно.

Я решил эту проблему, загрузив DataView с пустыми строками при загрузке страницы. Похоже, это обманывает DataView с использованием отображения данных для первого клика «Поиск».

Мой вопрос: правильно ли я делаю? Есть ли другой репитер, который лучше подходит для этой задачи? Это ошибка или что-то в этом роде?

1 Ответ

0 голосов
/ 31 августа 2011

Наконец-то взломали его: это было потому, что я загружал данные в свой провайдер данных только в методе 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();
  }
}
...