1

wicket-example http://www.wicket-library.com/wicket-examples/ajax/world-clock?0に世界時計の例があります。

私は同じことを試しましたが、リストビュー内で。

    final DataView<LongRunningTask> dataView = new DataView<LongRunningTask>("sorting", adp) {
        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(final Item<LongRunningTask> item) {
            ...
                final Label clock = new Label("timer", getCounter().getObject());

                item.add(clock);
                clock.setOutputMarkupId(true);
                add(new AbstractAjaxTimerBehavior(Duration.seconds(1)) {

                    @Override
                    protected void onTimer(AjaxRequestTarget target) {
                        target.add(clock);
                    }
                });
                ...
            }

        }
    };

しかし、これは機能していません。私が行った場合

 add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)));

ページ自体の中で、それは機能します。しかし、毎秒ページを更新したくはありません。listView 内の 1 つの項目 (時計) を更新したいだけです。

どうすればこれを機能させることができますか?

4

2 に答える 2

4

この問題の最も簡単な解決策は、周囲のコンテナではなく、動作をクロックに追加することです。

行ごとに1回、ビヘイビアーをDataViewに追加します。DataViewsはAjaxを介して更新できないため、これは必ず失敗します。代わりに、クロックコンポーネント自体の更新が機能します。

final DataView<LongRunningTask> dataView = new DataView<LongRunningTask>("sorting", adp) {
    private static final long serialVersionUID = 1L;

    @Override
    protected void populateItem(final Item<LongRunningTask> item) {
        ...
            final Label clock = new Label("timer", getCounter().getObject());

            item.add(clock);
            clock.setOutputMarkupId(true);
            clock.add(new AbstractAjaxTimerBehavior(Duration.seconds(1)) {

                @Override
                protected void onTimer(AjaxRequestTarget target) {
                    target.add(clock);
                }
            });
            ...
        }

    }
};

これをもう一度見てみると、別の原因があると思います。

final Label clock = new Label("timer", getCounter().getObject());

getCounter()。getObject()が何をするのか正確にはわかりませんが、モデルを返さない可能性があります...

final Label clock = new Label("timer", new PropertyModel(this, "counter"));

ここにより適しているはずです。getCounter()を定義するコンテナが確実にアドレス指定されるように、「this」を適切なプレフィックスのバージョンに置き換える必要があるかもしれません。

これが機能しない場合は、AjaxDebugWindowを確認してください。毎秒データが届くはずです。そうでない場合、コンポーネントは更新されません。データが変更されない場合、モデルは更新されません。これで武装すると、これを簡単に修正できるはずです。

于 2013-02-19T16:31:32.667 に答える
1

DataView を更新する必要があります。これを行うには、DataView を WebMarkupContainer に追加し、ajax タイマー動作で WebMarkupContainer をターゲットにします。

2 つ目の方法は、ラベルと ajax タイマーの動作を新しい Panel に追加することです。次に、そのパネルを DataView に追加します。私はこれまで試したことがないので、この方法が機能するかどうかはわかりませんが、試してみる価値はあります。

于 2013-02-19T16:03:39.053 に答える