Wicket - 使用ajax计时器更新listview中的项目

时间:2013-02-19 14:08:09

标签: ajax listview timer wicket

在wicket上有一个世界时钟示例 - 示例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中的一个项目(时钟)。

我有什么机会做这项工作?

2 个答案:

答案 0 :(得分:4)

此问题的最简单解决方案是将行为添加到时钟而不是周围的容器。

您每行都会将行为添加到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"));

应该更适合这里。您可能需要将“this”替换为适当的前缀版本,以确保定义了getCounter()的容器。

如果这不起作用,请查看AjaxDebugWindow。您应该看到每秒都有数据。如果不是,您的组件不会更新。如果数据未更改,则不会更新模型。有了这个,您应该能够轻松解决这个问题。

答案 1 :(得分:1)

您必须刷新DataView,然后将其添加到WebMarkupContainer并使用ajax计时器行为定位WebMarkupContainer。

第二种方法是将标签和ajax计时器行为添加到新的Panel。然后将该面板添加到DataView。我不确定这种方式是否有效,因为我以前从未尝试过,但值得一试。