0

Wicket Web ページ内に、以下を含む WebMarkupContainer がありますListView

notifications = new ArrayList<Notification>(...);
ListView listView = new ListView("notification", notifications) {
    @Override
    protected void populateItem(ListItem item) {
        ...
    }
};

container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
container.add(listView);
this.add(container);

これWebMarkupContainerは、画面上でユーザーに表示される項目のリストを動的に更新できるようにするために用意されています。これは、ユーザーがリンクをクリックするか、コンテナーを incoming に追加することで可能になりますAjaxRequestTarget

ここで、Ajax リクエストなしでリストを更新する必要があります。

public void refresh() {
    List<Notification> newNotifications = ... 
    notifications.addAll(0, newNotifications);
}

このメソッドはランタイム環境で呼び出され、Web ページのプライベート フィールド (最後のコードと同じもの) である通知のリストに新しいオブジェクトが含まれます。これらの新しいアイテムをユーザーに表示したい。コンテナーを更新 (または再レンダリング) することはできますか?

私は Wicket を初めて使用するので、同じ結果を達成するためのより良い方法があれば、教えていただければ幸いです。

4

1 に答える 1

2

あなたはタイマーでそれをしなければならないでしょう。これを行うには、 AjaxSelfUpdatingTimerBehaviorを使用します。適切な期間を設定し、「onTimer()」メソッドでコンテナをターゲットに追加するだけです。

編集:

「refresh()」関数が新しい通知が表示されたときにのみ呼び出される場合は、ページにフラグを設定できます (ページでブール変数を定義し、新しい通知が表示されたら true に変更し、listView が更新されたら false に変更します)。次に、動作に短い期間を設定すると、「onTimer()」は次のようになります。

onTimer(AjaxRequestTarget target) {
    if(newNotifications) {
        target.add(container);
        newNotifications = false;
    }
}

そしてリフレッシュ

public void refresh() {
    List<Notification> newNotifications = ... 
    notifications.addAll(0, newNotifications);
    newNotifiactions = true;
}

そうすれば、コンテナーはあまり頻繁に更新されず (奇妙な結果を引き起こす可能性があります)、新しい通知が表示されるたびに更新されます。

于 2013-09-05T04:58:37.327 に答える