0

我正在使用 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,但我并不完全清楚如何最好地处理在呈现页面时动态加载它。我试图加载一个模型的新实例,覆盖返回我的 LoadableDetachableModel 的 getObject() 类,但是对此感觉非常错误。任何输入将不胜感激。我一直试图通过专门的在线文档来了解这个框架,所以请原谅我明显缺乏熟悉。

4

2 回答 2

0

为了回答我自己的问题,我遇到的问题是绑定到表单的模型似乎在我每次返回页面时都会持续存在。这让我相信问题在于我如何管理模型,但问题实际上与我如何链接到页面有关。

上面的页面被链接到如下:

Link<String> link = new BookmarkablePageLink<String>("addLink", MyAddClass.class);

虽然在某些情况下这是一种可接受的方法,但在这种特殊情况下它不是正确的方法。应该发生的是这样的:

Link<String> link = new Link<String>("addLink") {
    public void onClick() {
        setResponsePage(new MyAddClass());
    }
}

当以这种方式动态处理链接时,我的应用程序将按预期运行。感谢所有参与帮助我发现链接的基本问题的人。

于 2013-02-18T21:47:14.817 回答
0

虽然链接方法(以前的答案)可能会带来问题,并且通常取决于您实现链接的方式,但在这种情况下,实际问题是用于加载域对象实例的“EntityFactory”。在这种情况下,它提供缓存数据而不是实例化新实例。

总而言之,当您再次浏览表单时,表单的模型对象似乎没有重置的情况下要评估的事情:

1 - 您用于访问页面的链接策略

2 - 您用于加载域对象并将其绑定到表单上的模型的方法

于 2013-02-19T19:28:23.767 回答