В Wicket, почему мои результаты не обновляются после отправки формы? - PullRequest
1 голос
/ 22 апреля 2011

Я борюсь с очень простой проблемой калитки. Я пытаюсь запросить базу данных бэкэнда, но не могу отобразить результаты. Ниже приведен код, который я использую. currentQuery и currentResult правильно обновляются после отправки, но мой класс SearchResults никогда не перерисовывается с новыми данными в currentResults. Я полагаю, что класс результатов просто не замечает, что модель фактически обновлена. Я экспериментировал с modelChanged, но не могу заставить его работать. Я немного новичок в Wicket, поэтому я, вероятно, делаю что-то фундаментальное совершенно неправильно. Любая помощь очень ценится!

public class SearchPage extends WebPage {

Query currentQuery = new Query();
Result currentResult = new Result();

public SearchPage() {
    add(new SearchForm("searchForm", new CompoundPropertyModel<Query>(currentQuery)));
    add(new SearchResults("searchResults", new PropertyModel<List<Hit>>(currentResult, "hits")));
}

public void doSearch(Query Query) {
    currentResult = getResults(query);
}

public class SearchForm extends Form<Query> {
    public SearchForm(String id, CompoundPropertyModel<Query> model) {
        super(id, model);
        add(new TextField<String>("query"));
    }

    protected void onSubmit() {
        super.onSubmit();
        doSearch(currentQuery);
    }
}
public class SearchResults extends WebMarkupContainer {
    public SearchResults(String id, PropertyModel<List<Hit>> model) {
        super(id, model);
        add(new ListView<Hit>("hit", model) {
            protected void populateItem(ListItem<Hit> item) {
                item.add(new Label("column", item.getModelObject().getColumnValue("column")));
            }
        });
    }
}

}

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

PropertyModel использует отражение для поиска именованного свойства в данном экземпляре целевого объекта.Когда вы создали PropertyModel, вы передали ему конкретный экземпляр Result, то есть new Result() из конструктора SearchPage.PropertyModel будет продолжать хранить ссылку на тот же экземпляр Result от рендеринга до рендеринга этой страницы, сериализуя Result в конце и затем десериализовывая Result в начале каждого нового цикла запроса (представление страницы).Тот факт, что вы позже измените переменную currentResult страницы для ссылки на другой экземпляр Result, не влияет на то, какой экземпляр Result PropertyModel использует для поиска значения модели.Ваша PropertyModel не заботится о том, на что ссылается currentResult.

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

  1. ЕстьPropertyModel читает hits из фактического текущего значения переменной currentResult страницы:

    new PropertyModel<List<Hit>>(SearchPage.this, "currentResult.hits")
    
  2. Используйте LoadableDetachableModel для загрузки hits один раз за запросцикл / просмотр страницы:

    new LoadableDetachableModel<List<Hit>>()
    {
        protected Object load()
        {
            return getResults(currentQuery);
        }
    }
    

Обратите внимание, что LoadableDetachableModel должен быть отключен в конце цикла запроса, или он никогда больше не вызовет getObject() для пересчета List<Hit>.Тем не менее, поскольку ваш код показывает, что вы будете использовать его в качестве модели по умолчанию для компонента SearchResults, компонент SearchResults автоматически отключит модель для вас в конце цикла запроса.

0 голосов
/ 23 апреля 2011

Я получил это работает.Кажется, что это неправильная строка:

add(new SearchResults("searchResults", new PropertyModel<List<Hit>>(currentResult, "hits")));

Тип PropertyModel, то есть List<Hit>, должен был сделать модель статической.Таким образом, единственными данными, которые SearchResults когда-либо видел, был исходный объект, который был пустым.

Я изменил строку на нижеприведенную и обновил SearchResult соответственно.

add(new SearchResults("searchResults", new Model<Result>(currentResult, "hits")));

Если кто-либоможете объяснить это дальше или считаете, что я не прав, прокомментируйте!В любом случае, я отмечаю свой собственный ответ как правильный, поскольку это решило проблему.

...