8

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

那么有谁知道我可以在哪里附加一个处理程序,以便我可以检查我的 AjaxPagingNavigator 中的可见性条件并启用/禁用可见性,以便在更新导航器时通过。ajax 它是可见的还是不可见的?

标记:

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

所以我有一个刷新“mainWrap”的ajax事件,它刷新“导航器”以及“列表”和包装。

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

 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 的子类中。

4

2 回答 2

16

在重写方法中进行昂贵的计算时要小心isVisible,因为 Wicket 将在isVisible每个请求中调用多次——不包括您可能无意中进行的任何调用。

通常,解决此问题的最佳方法是onConfigure手动覆盖和设置可见性标志。

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

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

于 2011-03-18T16:47:34.027 回答
1

自从我接触 Wicket 已经有一段时间了,但如果没有记错的话:

您能否不覆盖“导航器”对象的 isVisible() 方法,使其仅在您想要的条件下显示?

例如类似的东西

.addComponent(new AjaxPagingNavigator(...) {
  @Override public boolean isVisible() { 
    return model.getFound().size() > 25;
  }
});
于 2010-02-05T19:47:58.160 回答