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里面的一项(时钟)。

任何机会我怎么能做到这一点?

4

2 回答 2

4

解决这个问题最简单的方法是将 Behavior 添加到时钟而不是周围的容器中。

您每行将行为添加到 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。您应该会看到每秒都有数据。如果不是,您的组件不会更新。如果数据未更改,则您的模型不会更新。有了这个,你应该能够轻松解决这个问题。

于 2013-02-19T16:31:32.667 回答
1

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

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

于 2013-02-19T16:03:39.053 回答