2011-09-08 68 views
1

我正在使用Apache Wicket的Web應用程序,我有三種類型的頁面,基本上是一個編號列表。兩者之間的區別在於如何顯示列表中的項目。 (即一個有標題行和段落,另一個只有段落)。最終,數據將來自數據庫,但目前尚不可用。Wicket頁面與列表面板

我想我可以通過創建一個頁面來顯示一個RepeatingView,它從Panels的ArrayList中獲取它的項目。我將爲每種類型的列表項目創建一個不同的面板。然後,我可以將上述頁面擴展爲三個子類,每個子類都需要一個特定類型的面板。我在正確的軌道上,還是有更好的方法來做到這一點?

回答

0

我不認爲你必須繼承你的頁面。據我所知,這一個根本沒有改變。所有更改都在面板內。所以基本上所有你需要做的是提供重複視圖與不同的面板列表。如果這些差異像展示標題一樣小,你甚至不需要爲這些創建不同的類。只需將標題設置爲空字符串並將其設置爲不可見...

基本上是的,你在正確的軌道之一,也許不是我選擇的那個,但你的工作太...

5

我發現RepeatingView對於這種事情非常靈活,你不應該需要三個單獨的頁面。它只是期望一個組件被添加到中繼器,而不是什麼類型的組件。只要保持Wicket ID一致,您甚至可以將自帶標記的組件(例如Panel/Fragment)混合在一起。

我也不鼓勵你使用面板列表。列表中包含您的數據,然後根據某個標誌添加相應的視圖容器,這隻會對編程有好處。

所以,像這樣的標記:

<div wicket:id="repeater"> 
    <div wicket:id="listItem" /> 
</div> 

作品的東西,如:

RepeatingView rv = new RepeatingView("repeater"); 

for (DataObject o : dataList) { 
    // You can probably add to the rv directly, but this is the common usage 
    WebMarkupContainer c = new WebMarkupContainer(rv.newChildId()); 
    rv.add(c); 
    if (shortVersion) 
     c.add(new ShortPanel("listItem", new Model<DataObject>(o))); 
    else 
     c.add(new LongPanel("listItem", new Model<DataObject>(o))); 
} 

而不是到你的頁面提供面板的列表中,您從數據庫提供數據的同一列表然後根據當前視圖添加不同的面板。

最後,根據每個視圖類型,您有一個頁面(帶有標記視圖類型)和不同的面板(或片段)。

+0

重要:中繼器內的wicket:id必須命名爲「listItem」,否則不起作用 – bebbo