(Wicket)在ajax响应期间更改可见性

时间:2010-02-05 19:42:08

标签: java wicket

我有一个AjaxPagingNavigator。基本上在某种情况下,重新加载AjaxPagingNavigator页面的列表。发生这种情况时,我只想在列表包含多个页面时呈现导航器。

所以有人知道我可以在哪里附加处理程序,以便我可以在我的AjaxPagingNavigator中检查可见性条件并启用/禁用可见性,以便在导航器通过时更新。 ajax是否可见?

标记:

<div wicket:id="mainWrap">
    <div wicket:id="navigator"/>
    <div wicket:id="listWrap">
        <div wicket:id="list><!-- here be content --></div>
    </div>
</div>

所以我有一个ajax事件刷新“mainWrap”,刷新“navigator”以及“list”和包装。

这是触发整个事件的事件。

 protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
     List foo = null; // do work to get list
     model.setFound(found); // update the model (thus updating "list")
     target.addComponent(mainWrap);
}

编辑:我知道我可以写

navigator.setVisibility(list.getPageCount() > 1);

创建导航器后和更新模型后,但我希望将其封装在AjaxPagingNavigator的子类中。

2 个答案:

答案 0 :(得分:16)

在覆盖的isVisible方法中进行昂贵的计算要小心,因为Wicket会在每次请求时多次调用isVisible - 不计算您可能无意中执行的任何调用。

通常,最好的方法是覆盖onConfigure并手动设置可见性标记。

@Override
void onConfigure() {
    super.onConfigure();
    setVisible(isVisible() && someExpensiveToCalculateCondition);
}

onConfigure在请求处理期间只调用一次,并调用所有组件,包括那些不可见的组件(而onBeforeRender仅调用可见组件)。

答案 1 :(得分:1)

自从我触及Wicket以来已经有一段时间了,但是如果记忆有效:

你能否覆盖“导航器”对象的isVisible()方法,以便它只在你想要的条件下显示?

e.g。

之类的东西
.addComponent(new AjaxPagingNavigator(...) {
  @Override public boolean isVisible() { 
    return model.getFound().size() > 25;
  }
});