我正在使用Apache Wicket编写表单。相同的页面/类用于向数据库添加新项目以及编辑数据库中的现有记录。当然,由于页面构造函数只被调用一次,因此模型总是设置为页面上最初加载的任何记录,如果我们不编辑现有记录,则设置为新记录。
我已经找到了许多动态加载数据的方法,但它们看起来很冗长,而且有点笨重。我怀疑有一个处理这种情况的最佳做法。
作为参考,这里有一些编辑过的代码:
public class JobManagement extends WebPage {
private static final long serialVersionUID = 1L;
private long jobId = 0;
protected void setJobId(long id) {
this.jobId = id;
}
protected long getJobId() {
return jobId;
}
public JobManagement() {
LoadableDetachableModel<Job> jobModel = new LoadableDetachableModel<Job>() {
private static final long serialVersionUID = 1L;
@Override
protected Job load() {
Job job = (Job) EntityFactory.getInstance().getBean("job");
// if we're editing an existing job, load the object
if (jobId >= 1) {
job.load(jobId);
}
return job;
}
};
add(new FeedbackPanel("feedbackPanel"));
Form<Job> jobForm = new Form<Job>("jobForm") {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit() {
// Handles the form submit...
}
};
add(jobForm);
jobForm.setModel(new CompoundPropertyModel<Job>(jobModel));
// SNIP ... All my form fields go here!
jobForm.add(new Button("submit"));
}
}
我正在使用LoadableDetachableModel,但我不完全清楚如何在呈现页面时动态加载它。我试图加载一个Model的新实例,覆盖返回我的LoadableDetachableModel的getObject()类,但是有些东西感觉非常错误。任何输入将不胜感激。我一直试图通过在线文档专门感受我的方式,所以原谅我明显缺乏熟悉。
答案 0 :(得分:0)
要回答我自己的问题,我遇到的问题是,每次返回页面时,绑定到表单的模型似乎都会持续存在。这让我相信问题在于我是如何管理模型的,但问题实际上与我如何链接到页面有关。
上面的页面链接如下:
Link<String> link = new BookmarkablePageLink<String>("addLink", MyAddClass.class);
虽然在某些情况下这是一种可接受的方法,但在这种特殊情况下,这不是正确的方法。应该发生的是:
Link<String> link = new Link<String>("addLink") {
public void onClick() {
setResponsePage(new MyAddClass());
}
}
以这种方式动态处理链接时,我的应用程序按预期运行。感谢所有投入的人,帮助我通过我的链接了解这个根本问题。
答案 1 :(得分:0)
虽然链接方法(上一个答案)可能会产生问题并且通常取决于您如何实现链接,但在这种情况下,实际问题是使用“EntityFactory”来加载域对象的实例。在这种情况下,它提供缓存数据而不是实例化新实例。
总结一下,在这样的情况下要评估的事情,当你第二次浏览表单时,表单的模型对象似乎没有重置:
1 - 您用于访问页面的链接策略
2 - 用于将域对象加载并绑定到表单
上的模型的方法