在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中的一个项目(时钟)。
我有什么机会做这项工作?
答案 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。我不确定这种方式是否有效,因为我以前从未尝试过,但值得一试。