3

我第一次使用以下 URL 导航到我的应用程序:

.../homepage/?0&user= x

在调试模式下,我看到 wicket 很好地实例化了我的面板等(显然)。

如果我将 URL 更改为:

.../homepage/?0&user= y

然后什么也没有发生,面板没有重新初始化(对于新用户 => 用户 x 的数据仍然显示),也没有调用 LoadableDetachable 或其他模型。

但是,如果我将 URL 更改为:

.../主页/?1 &用户=y

然后为用户y很好地初始化所有面板

更进一步,如果您将 URL 更改回

.../主页/?0 &用户= y

然后再次显示用户x的数据。

似乎 Wicket 并不关心 URL 中的参数是否已更改,以决定是否重新加载组件。AFAIK 这在 Wicket 1.4 中运行良好。我想我理解这种行为背后的逻辑,但不确定。另外,我想知道如果自定义参数发生更改,如何强制 Wicket 重新加载,以及如何从 URL 中删除那个“丑陋的”?0(如果可能的话)?

4

3 回答 3

5

这就是 Wicket 的有状态特性。页面实例化一次,参数解析等等。稍后您将不同的参数传递给已经实例化的页面,但这次它的构造函数根本没有被调用,因此 PageParameters 没有更新。更改为 ?1 向 Wicket 询问 id 为 1 的页面,并且由于没有这样的 Wicket 实例化一个新实例并传递新参数。如果您想始终拥有最新的请求参数,请使用 getRequest().getRequestParameter("user") 这将为您提供所需的内容。说得通 ?

于 2011-11-10T15:34:34.340 回答
2

要修改 martin-g 的答案:您应该在模型中检索请求参数,并使用请求参数检索正确的用户。就像是:

setModel(new LoadableDetachableModel<User>(){
    public User load() {
        String username = getRequest().getRequestParameter("user");
        return userservice.byUsername(username);
    }
}));

当您需要动态数据时,几乎总是使用模型来解决您的问题。

于 2011-11-13T08:36:43.747 回答
0

我认为您可以使用onRenderonConfigure

于 2013-03-28T08:50:15.877 回答