我正在努力解决一个非常基本的Wicket问题。我正在尝试查询后端数据库,但无法显示结果。下面是我正在使用的代码。提交后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")));
}
});
}
}
}
答案 0 :(得分:1)
PropertyModel使用反射来查找给定目标对象实例上的命名属性。构造PropertyModel时,您向它传递了一个特定的Result实例,即来自SearchPage构造函数的new Result()
。 PropertyModel将继续保持对同一Result实例的引用,从渲染到此页面的呈现,最后序列化Result,然后在每个新请求周期(页面视图)开始时反序列化Result。您稍后更改页面的currentResult
变量以引用不同的Result实例这一事实不会影响PropertyModel用于查找其模型值的Result实例。您的PropertyModel不关心currentResult
后面引用的内容。
我可以想到两种可能的解决方案。
让PropertyModel从Page的hits
变量的实际当前值中读取currentResult
:
new PropertyModel<List<Hit>>(SearchPage.this, "currentResult.hits")
使用LoadableDetachableModel在每个请求周期/页面视图中加载hits
:
new LoadableDetachableModel<List<Hit>>()
{
protected Object load()
{
return getResults(currentQuery);
}
}
请注意,LoadableDetachableModel
必须在请求周期结束时分离,否则永远不会再调用getObject()
重新计算List<Hit>
。也就是说,由于您的代码显示您将其用作SearchResults
组件的默认模型,SearchResults
组件会在请求周期结束时自动为您分离模型。
答案 1 :(得分:0)
我得到了它的工作。这似乎是违规行:
add(new SearchResults("searchResults", new PropertyModel<List<Hit>>(currentResult, "hits")));
PropertyModel
的类型,即List<Hit>
,必须使模型保持静态。因此,唯一看到的数据SearchResults
是初始对象,它是空的。
我将该行更改为以下内容,并相应地更新了SearchResult
。
add(new SearchResults("searchResults", new Model<Result>(currentResult, "hits")));
如果有人可以进一步解释,或者觉得我不对,请发表评论!无论如何,我将自己的答案标记为正确,因为这解决了问题。