2013-02-19 54 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。我不知道這種方式是否會奏效,因爲我從來沒有嘗試過,但它值得一試。