在Wicket中,为什么在提交表单后我的结果不会更新?

时间:2011-04-22 18:45:21

标签: java wicket

我正在努力解决一个非常基本的Wicket问题。我正在尝试查询后端数据库,但无法显示结果。下面是我正在使用的代码。提交后currentQuerycurrentResult已正确更新,但我的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 个答案:

答案 0 :(得分:1)

PropertyModel使用反射来查找给定目标对象实例上的命名属性。构造PropertyModel时,您向它传递了一个特定的Result实例,即来自SearchPage构造函数的new Result()。 PropertyModel将继续保持对同一Result实例的引用,从渲染到此页面的呈现,最后序列化Result,然后在每个新请求周期(页面视图)开始时反序列化Result。您稍后更改页面的currentResult变量以引用不同的Result实例这一事实不会影响PropertyModel用于查找其模型值的Result实例。您的PropertyModel不关心currentResult后面引用的内容。

我可以想到两种可能的解决方案。

  1. 让PropertyModel从Page的hits变量的实际当前值中读取currentResult

    new PropertyModel<List<Hit>>(SearchPage.this, "currentResult.hits")
    
  2. 使用LoadableDetachableModel在每个请求周期/页面视图中加载hits

    new LoadableDetachableModel<List<Hit>>()
    {
        protected Object load()
        {
            return getResults(currentQuery);
        }
    }
    
  3. 请注意,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")));

如果有人可以进一步解释,或者觉得我不对,请发表评论!无论如何,我将自己的答案标记为正确,因为这解决了问题。