Wicket 9.10.0中面板替换组件方法导致分离模型页面



我使用了wicket hello page来重现我认为的错误,我正在试图找到解决方案。

在面板和组件中使用的页面中有一个可拆卸的模型。这个模型将在数据库中进行多次查询,所以当它无用时,我无法承受多次加载

在本页中,我有20个面板使用相同的模型,在第一次调用面板创建并使用相同的附加数据(因此只有一个加载调用),并且请求端模型被分离,然后我修改一些东西并尝试替换所有面板中的组件,这里有问题,所有删除组件调用将分离并重新加载模型。

一个简单的例子来复制它(PS getModel调用只是在这里检查何时加载新模型或模型加载)

private static final long serialVersionUID = 1L;

Panel panel ;
IModel<String> model = new LoadableDetachableModel<String>() {
@Override
protected String load() {
return "test";
}
@Override
protected void onDetach() {
super.onDetach();
}
};

public HomePage(final PageParameters parameters) {
super(parameters);
model.getObject();
add(new Label("version", getApplication().getFrameworkSettings().getVersion()));
panel = new HomePanel( "homePanel");
//first time no problem
panel.addOrReplace(  new Label( "test", model ) );
add(panel);
//use ame model loaded
model.getObject();
**//here will detach the model**
panel.addOrReplace(  new Label( "test", model ) );
**// Error here because load a new model**
model.getObject();
}
}

then panel class

import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
public class HomePanel extends Panel {
Label label;
public HomePanel(String id) {
super( id );
}
public HomePanel(String id, IModel<String> model) {
super( id, model );
}
}

然后简单地在主页添加面板

你知道吗?这是正常的,而不是分离子模型,它分离父页面模型?

"这是正常的,而不是分离子模型,它分离父页面模型?">

它分离了id = "test"的前/旧组件的模型。加上:

//first time no problem
panel.addOrReplace(  new Label( "test", model ) );

该模型恰好是共享模型实例。

要解决这个问题,你可以在删除旧组件之前为它设置一个新模型:

panel.get("test").setModel(null);
**//here will detach the model. Update: no more!**
panel.addOrReplace(  new Label( "test", model ) );

最新更新