2011-06-11 48 views
4

當一個屏幕有多個交互的Ajax控件,並且你想控制組件對這些控件作出反應的可見性(這樣你只顯示在任何給定情況下有意義的東西),手動調用target.addComponent()你想更新變得越來越繁瑣,而且不是很好維護。檢票和複雜的Ajax場景

最後,onClickonUpdate網絡的回調可以達到在屏幕上添加新組件比預期難得多的地步。

什麼是常用的策略(或甚至圖書館,如果這樣的事情存在),以避免這種複雜性的積累?

更新:感謝您的回答,我發現它們都非常有用,但我只能接受一個。抱歉。

回答

2

那麼,我們在這裏講幾個組件?十?二十?數百?

對於最多二十個或關於這個,你可以有一個狀態控制器來控制哪些組件應該被顯示。此控制器設置組件模型的可見字段,並且始終將所有組件添加到由控制器處理的請求中。您只需將組件ajax事件重定向到控制器句柄方法。

對於真正大量的組件來說,爲了獲得良好的性能,負載太重,您可以使用jQuery等javascript庫來進行顯示並隱藏客戶端的內容。

+0

我不認爲你應該有一個屏幕上遠遠超過與20個元件反正,所以這是我在這裏瞄準最大。 – biziclop 2011-06-11 20:21:11

8

您可以添加結構組件,例如WebMarkupContainer s,當您將其添加到AjaxTarget時,它所包含的所有內容也將得到更新。這使您可以在一行中更新組件組。

9

在Wicket 1.5中有一個事件總線。每個組件都有onEvent(Object payload)方法。使用component.send(),您可以廣播事件,並且每個組件都可以檢查有效負載(例如UserJoinedEvent對象)並決定是否要參與當前的Ajax響應。請參閱http://www.wicket-library.com/wicket-examples/events/進行簡單演示。

+2

這聽起來很有希望。 – biziclop 2011-06-13 14:58:02

2

我目前使用某種修改的Observer-Pattern來模擬Wicket 1.4中的事件總線。

我的頁面充當可觀察的觀察者,因爲我的組件不相互認識,並且在多個頁面的不同組合中重用。每當一個組件接收到一個Ajax事件時,也會影響其他組件,它會在其頁面上調用一個事件對象和ajax目標的方法。頁面調用所有爲這類事件註冊自己的組件的類似方法,並且每個組件可以根據提供的事件對象決定是否以及如何反應,並可以將它自己附加到目標上。

同樣的可以通過使用檢票訪問者存檔。我不知道哪一個更好,但我認爲這主要是品味的問題。

3

當我創建用於頁面組件我傾向於將它們添加到組件數組:

Component[] pageComponents = { 
        new TextField<String>("Field1"), 
        new TextField<String>("Field2"), 
        new TextField<String>("Field3") 
} 

作爲檢票1.5的附加功能採取陣列參數[1]。因此元素可以添加到頁面或目標是這樣的:

add(pageComponents); 
target.add(pageComponents); 

組件然後可以在此基礎上要刷新組合在一起。

[1] http://www.jarvana.com/jarvana/view/org/apache/wicket/wicket/1.5-M3/wicket-1.5-M3-javadoc.jar!/org/apache/wicket/ajax/AjaxRequestTarget.html