2010-09-05 20 views
3

讓我們考慮以下問題。如何用Tapestry創建多個籃子選擇

有一個網頁包含籃子。籃子是一個包含水果或汽車等物品列表的組件。

在頁面中有三個籃子:籃子,水果籃和全籃子。車籃包含汽車,水果籃包含水果,全籃子可以包含汽車和水果。

最初只有在汽車和水果籃的項目。通過點擊這些籃子中的物品,該物品將被移至全部籃子。通過點擊全部籃子中的物品,物品將被移回原來的籃子。

此外,水果項目和汽車項目呈現不同。例如,汽車物品可能包含與水果物品不同類型的背景。此外,商品可能包含不同類型的信息。例如,汽車物品包含汽車的最高速度,水果物品包含水果的顏色。

此渲染也必須保留在全部籃子中。

你會怎樣用Tapestry做這個頁面?我不需要全面的實施。我只是對如何解決這個問題的原則感興趣。

此外,爲了簡化實施,您可以對需要多少時間做出一些估計?

回答

2

首先,您會爲汽車和水果創建components。通過項目顯示汽車和水果籃,然後只顯示loops,顯示每個人的水果/汽車部件。

混合籃子有點棘手。掛毯不是很擅長動態結構(「動態行爲,靜態結構」),所以你需要一個if結構來渲染汽車或水果組件。

<t:loop t:source="items" t:value="currentItem"> 
    <t:if t:test="currentCar"> 
     <span t:type="Car" t:car="currentCar" /> 
    </t:if> 
    <t:if t:test="currentFruit"> 
     <span t:type="Fruit" t:fruit="currentFruit" /> 
    </t:if> 
</t:loop> 

,A組分中getCurrentCar()方法應該返回null時currentItem不是汽車,並且當物品是不是一種水果getCurrentFruit()應該返回null。

要讓事情在列表之間移動,您可以使用ActionLinks以及適當的event handlers。爲了支持AJAX,你可以使用Tapestry的內置Zone功能。要一次更新多個區域,可以從事件處理程序返回一個MultiZoneUpdate對象。 (或者你可以編寫你自己的,優化的客戶端代碼。)

你應該能夠在很短的時間內設置這個基本結構,總共需要多長時間取決於你想要的東西多精細要得到。

1

這裏是海寧的做法的延續:

<!-- render car basket --> 
<t:loop t:source="carBasket" t:value="currentItem"> 
    <t:if t:test="currentCar"> 
     <span t:type="Car" t:car="currentCar" /> 
     <!-- TODO : eventlink for add to all basket --> 
    </t:if> 
</t:loop> 

<!-- render fruit basket --> 
<t:loop t:source="fruitBasket" t:value="currentItem"> 
    <t:if t:test="currentFruit"> 
     <span t:type="Fruit" t:fruit="currentFruit" /> 
     <!-- TODO : eventlink for add to all basket --> 
    </t:if> 
</t:loop> 

<!-- render all basket --> 
<t:loop t:source="allBasket" t:value="currentItem"> 
    <t:if t:test="currentCar"> 
     <span t:type="Car" t:car="currentCar" /> 
     <!-- TODO : eventlink for back to car basket --> 
    </t:if> 
    <t:if t:test="currentFruit"> 
     <span t:type="Fruit" t:fruit="currentFruit" /> 
     <!-- TODO : eventlink for back to fruit basket --> 
    </t:if> 
</t:loop> 

在頁面上你會有這樣的事情

@Property 
private Item currentItem; 

public Set<Item> getAllBasket(){ 
    return allBasket; 
} 

public Set<Car> getCarBasket(){ 
    return carBasket; 
} 

public Set<Fruit> getFruitBasket(){ 
    return fruitBasket; 
} 

public Fruit getCurrentFruit(){ 
    return currentItem instanceof Fruit ? (Fruit)item : null; 
} 

public Car getCurrentCar(){ 
    return curretItem instanceof Car ? (Car)item : null; 
}