2011-06-11 75 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