如何制作一个wicket组件,在每个AJAX请求重新呈现到页面?

时间:2011-04-08 16:32:07

标签: java ajax wicket

有没有办法让Wicket组件在每个页面的AJAX请求上重新呈现? (基本上是为了做ajaxRendered="true"在RichFaces中的作用。)

我的申请基本上包含以下内容:

  • 可编辑的数据网格记录用户正在进行的更改
  • 这些更改存储在会话
  • 有保存更改或撤消更改的按钮。

应启用或禁用保存和撤消按钮,具体取决于是否有任何记录的更改。由于有多种方法可以输入更改(编辑,导入CSV等),因此我希望避免拦截可能会更改已保存状态的每个操作。

此外,这些按钮仅显示在某些页面上,因此我不想在自定义WebRequestCycle的页面中嗅探它们。

当一个AJAX请求即将被处理时,是否有一个Wicket调用的钩子,这是为页面上的每个组件调用的?我知道有Component#onBeforeRender()Component#onConfigure(),但是他们的文档没有说明他们何时被要求提供AJAX请求。

2 个答案:

答案 0 :(得分:9)

在Wicket 1.5中有一辆活动巴士。对于每个Ajax请求,会向每个组件发送一个事件,组件可以使用AjaxRequestTarget添加自身以进行重新呈现。

E.g:

class MyComponent ... {

 public void onEvent(Object payload) {

   if (payload instanceod AjaxRequestTarget) {
     ((AjaxRequestTarget) payload).add(this);
   }
 } 

答案 1 :(得分:2)

我遇到了类似的问题,想到了两个可能的解决方案,我使用了第二个解决方案。

  1. 在Ajax-Handler中调用页面上的方法,然后调用访问者查找需要重新呈现的所有子项,并将它们添加到目标。

  2. 观察者模式的变体...... 我让我的组件在页面上注册为wantToUpdate并触发了一个函数,将它们全部添加到我的Ajax-Handler中的Requesttarget中。我无法使用开箱即用的观察者模式,因为我的组件彼此不了解,我不想引入这种耦合。