2013-02-18 27 views
0

我正在使用Apache Wicket編寫表單。使用相同的頁面/類將新項目添加到數據庫並編輯數據庫中的現有記錄。當然,由於頁面構造函數只被調用一次,因此模型始終設置爲最初加載到頁面上的任何記錄,或者如果我們不編輯現有記錄,則會創建新記錄。如何在使用Wicket窗體時更好地處理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,但它並不完全清楚,我如何最好地處理動態加載它,每當該頁面渲染。我試圖加載模型的一個新實例,重寫getObject()類,它返回我的LoadableDetachableModel,但有些東西感覺非常錯誤。任何輸入將不勝感激。我一直試圖通過獨家的在線文檔來感受我通過這個框架的方式,所以請原諒我明顯缺乏熟悉性。

+3

我不太確定的方法,要archieve但作爲一個旁註什麼:它通常會更好地保持構造函數儘可能短,並將代碼移動到'initialize()'和'onBeforeRender()'方法。在每次渲染前首次渲染組件之前調用initialize(),onBeforeRender()。也許這可能有助於解決您的問題。 – Nicktar 2013-02-18 09:42:12

+0

@Nicktar我絕對看到你在說什麼。我會嘗試使用這些方法來查看我是否可以得到我期待的結果。 – mchandler 2013-02-18 15:29:55

回答

0

爲了回答我自己的問題,我遇到的問題是,每當我返回頁面時,綁定到表單的模型似乎都會持續存在。這導致我相信問題在於我如何管理模型,但問題實際上與我如何鏈接頁面有關。

頁上面被鏈接到如下:

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

雖然這是在某些情況下可接受的方法,它是在這特定的情況下正確的方法。什麼應該發生是這樣的:

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

當鏈接以這種方式處理的動態,我的應用程序的表現如預期。感謝所有參與我的鏈接,幫助我解開這個基本問題的人。

0

儘管鏈接方法(以前的答案)可能會引起問題,並且通常取決於您如何實現鏈接,但實際問題是使用「EntityFactory」來加載域的實例目的。在這種情況下,它提供了緩存數據,而不是實例化一個新實例。

綜上所述,東西像這些在表單的模型對象不出現的情況下,以評估當您瀏覽的形式第二次復位:

1 - 您所用的鏈接策略得到的頁面

2 - 您使用的是加載和域對象綁定到模型的形式