2013-02-19 49 views
1

有一个世界时钟的例子,例如wicket-example http://www.wicket-library.com/wicket-examples/ajax/world-clock?0Wicket - 使用ajax计时器更新listview内的项目

我试过一样,但在列表视图内。

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

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

您正在向DataView每行添加一次行为。由于DataView不能通过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。你应该看到每秒钟都会有数据。如果它不是你的组件没有更新。如果数据没有更改,您的模型不会更新。有了这个武装,你应该能够很容易地解决这个问题。

+0

我试过了,但没有运气。我会再试一次:) – 2013-02-20 01:26:28

+0

@Dave我觉得我找到了罪魁祸首。看我的编辑。 – Nicktar 2013-02-20 08:49:42

+0

其实它的task.getCounter()其中任务是另一个Java类...和task.getCounter().getObject()返回一个字符串...因为第二个参数的时钟标签应该是一个字符串... – 2013-02-20 14:12:26

1

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

第二种方法是将标签和ajax计时器行为添加到新面板。然后将该面板添加到您的DataView。我不知道这种方式是否会奏效,因为我从来没有尝试过,但它值得一试。