1

Wicket を使用して、画面に大きなリストを表示したい。

リストにはPanel、多くの ajax/js 機能を備えた が含まれています。リストは長くなりがちなので、最初の 10 エントリだけを表示するように、いくつかの制限を設けています。さらにエントリを取得するには、ユーザーは「詳細」リンクを押す必要があります。

ただし、アイテムはListView(任意のリピーターである可能性があります)にあります。リピーターにアイテムを追加したい場合、Wicket はリピーターを AjaxRequestTarget に追加するよう強制します。この結果は、ブラウザでのリピーターの完全な再描画です。

これを防ぎたい。jQuery / javascriptから完全にこれを行うことで、それができるかもしれないと思います。新しい 10 個のエントリを非表示の div にレンダリングするように要求し、それらをリストに追加します。これは非常に悪いようです。

誰でもより良いアプローチを提案できますか?

4

2 に答える 2

1

私は同じ問題に直面し、ウィケットのみで解決することができました: から派生したクラスを作成しますGenericPanel(または単にPanel) を含みます:

  • IModel<Long> currentOffsetModel
  • ListView
  • AjaxLink
  • div(またはその他のプレースホルダー要素)としてWebmarkupContainer
  • currentOffsetModel から始まる ListView のリストをロードする LoadalbeDetechable Model

AjaxLink-onClickメソッドでは、プレースホルダー div をカスタム クラスの新しいオブジェクト ("replaceWith") に置き換え、AjaxLink の可視性を false に設定し、AjaxLink と新しいオブジェクトを AjaxRequestTarget に設定する必要があります。

class EndlessListPanel extends Panel {

    WebmarkupContainer placeholder = new WebmarkupContainer("placeholder");

    ...

    AjaxLink<Void> nextListElem = new AjaxLink<Void>("next") {

        private static final long serialVersionUID = 1L;

        @Override
        public void onClick(AjaxRequestTarget target) {
            int offset = offsetModel.getObject().intValue();
            EndlessListPanel next = new NewsPanelList("placeholder",offset + 5);
            placeholder.replaceWith(next);
            setVisibilityAllowed(false);
            target.add(this, next );
        }

        @Override
        protected void onConfigure() {
            // The "if" prevents "previous" EndlessListPanel to query the LDM.
            if (isVisibilityAllowed()) {
                setVisibilityAllowed(!listing.getObject().isReachedEnd());
            }
            super.onConfigure();
        }
    };

    ...
}

対応するhtml:

<改札:パネル>

<ウィケット:コンテナウィケット:id="listItem"/>

<a wicket:id="next">次へ</a>

<div wicket:id="placeholder"></div>

</ウィケット:パネル>
于 2013-09-17T12:13:02.997 に答える