8

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>

したがって、「リスト」とラッピングとともに「ナビゲーター」をリフレッシュする「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

isVisibleWicket は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 に答える