当屏幕有多个交互式Ajax控件并且您想要控制组件的可见性以对这些控件做出反应时(这样您只显示在任何给定情况下有意义的内容),在您的所有内容上手动调用target.addComponent()
想要更新变得越来越麻烦,而且难以维护。
最终,onClick
和onUpdate
回调网络可能会达到这样一种程度,即在屏幕上添加新组件变得比预期的要困难得多。
为避免这种复杂性的积累,常用的策略(甚至是存在这样的库的库)是什么?
更新:感谢您的回答,我发现所有这些都非常有用,但我只接受一个。遗憾。
答案 0 :(得分:9)
在Wicket 1.5中有一辆活动巴士。每个组件都有onEvent(Object payload)方法。使用component.send(),您可以广播事件,每个组件都可以检查有效负载(例如UserJoinedEvent对象)并决定是否要参与当前的Ajax响应。有关简单演示,请参阅http://www.wicket-library.com/wicket-examples/events/。
答案 1 :(得分:8)
您可以添加WebMarkupContainer
等结构组件,当您将其添加到AjaxTarget时,其中包含的所有内容也将更新。这允许您在一行中更新组件组。
答案 2 :(得分:3)
当我为页面创建组件时,我倾向于将它们添加到组件数组中:
Component[] pageComponents = {
new TextField<String>("Field1"),
new TextField<String>("Field2"),
new TextField<String>("Field3")
}
从Wicket 1.5开始,add函数采用数组参数[1]。因此,可以将元素添加到页面或目标中,如下所示:
add(pageComponents);
target.add(pageComponents);
然后可以根据您要一起刷新的组件对组件进行分组。
答案 3 :(得分:2)
那么,我们在这里说了多少组件?十?二十?数百Ω
对于最多二十个或大约这个,你可以有一个状态控制器来控制应该显示哪些组件。此控制器设置组件模型的可见字段,并始终将所有组件添加到由控制器处理的请求中。组件ajax事件只需重定向到控制器句柄方法。
对于大量具有过重负载以获得良好性能的组件,您可以使用jQuery等javascript库来进行显示并通过客户端隐藏内容。
答案 4 :(得分:2)
我目前使用某种经过修改的Observer-Pattern来模拟Wicket 1.4中的事件总线。
我的页面充当可观察的观察者,因为我的组件彼此不了解并且在多个页面中以不同的组合重用。每当一个组件收到可能影响其他组件的Ajax事件时,它就会在其页面上调用一个带有event-object和ajax-target的方法。该页面对所有已为此类事件注册的组件调用类似的方法,并且每个组件可以根据提供的事件对象决定它是否以及如何做出反应并将其自身附加到目标。
使用wicket访客可以存档相同的内容。我不知道哪一个更好,但我认为这主要是品味问题。