2013-03-12 34 views
3

我得到了一些數據進入我的propertyListview,得到了一個容器,但是當我想用Ajax更新它時,它什麼都不做!我如何使用Ajax更新PropertyListview?Wicket - Ajax PropertyListView

編輯 使用JSON解析解析從氣象站的數據,這些數據可以很多改變,所以我想在propertyListview

public class WeerPanel extends Panel { 

public WeerPanel(String id) throws IOException { 
    super(id); 

    final WeerService weerService = new WeerServiceImpl(); 

    PropertyListView<Weer> newview = new PropertyListView<Weer>("weer", weerService.getWeer()) { 

     @Override 
     protected void populateItem(ListItem<Weer> item) { 
      item.add(new Label("temperatuur")); 
      item.add(new StaticImage("type", String.format("images/%s.png", item.getModelObject().getType()))); 
      item.add(new Label("omschrijving")); 
     } 
    }; 

    final WeerVoorspellingService weerVoorspellingService = new WeerVoorspellingServiceImpl(); 

    PropertyListView<WeerVoorspelling> hateView = new PropertyListView<WeerVoorspelling>("weersvoorspelling", weerVoorspellingService.getWeerVoorspelling()) { 

     @Override 
     protected void populateItem(ListItem<WeerVoorspelling> item) { 
      item.add(new Label("dag")); 
      item.add(new StaticImage("typeVoorspelling", String.format("images/%s.png", item.getModelObject().getType()))); 
      item.add(new Label("minTemperatuur")); 
      item.add(new Label("maxTemperatuur")); 
     } 
    }; 

    final WebMarkupContainer containerWeer = new WebMarkupContainer("containerWeer"); 
    containerWeer.setOutputMarkupId(true); 
    containerWeer.add(hateView); 
    containerWeer.add(newview); 
    add(containerWeer); 

    add(new AbstractAjaxTimerBehavior(Duration.seconds(10)) { 

     @Override 
     protected final void onTimer(AjaxRequestTarget target) { 
      target.add(containerWeer); 
     } 
    }); 
} 

}

更新數據的背景IM這是我在後臺做的一些代碼,它是一個虛擬的,每次都會隨機改變天氣的溫度。

   Random r = new Random(); 
      int randomInt = r.nextInt(100); 
      weer.add(new Weer("rain", "Mooi bewolkt", randomInt, v.getVoorspellingen())); 

僞代碼是好的,但仍然沒有什麼改變的,看看我的網頁....好像我的列表心不是獲得任何新的數據..

固定這裏是人的代碼,會發現這個方便

public class WeerPanel extends Panel { 

    public WeerPanel(String id) { 

     super(id); 

     add(createContainer()); 

     add(new AbstractAjaxTimerBehavior(Duration.seconds(10)) { 
      @Override 
      protected final void onTimer(AjaxRequestTarget target) { 
       target.add(createContainer()); 
      } 
     }); 
    } 

    private final WebMarkupContainer createContainer() { 
     final WeerService weerService = new WeerServiceImpl(); 

     PropertyListView<Weer> newview = null; 
     try { 
      newview = new PropertyListView<Weer>("weer", weerService.getWeer()) { 

       @Override 
       protected void populateItem(ListItem<Weer> item) { 
        item.add(new Label("temperatuur")); 
        item.add(new StaticImage("type", String.format("images/%s.png", item.getModelObject().getType()))); 
        item.add(new Label("omschrijving")); 
       } 
      }; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     WeerVoorspellingService weerVoorspellingService = new WeerVoorspellingServiceImpl(); 

     PropertyListView<WeerVoorspelling> hateView = null; 
     try { 
      hateView = new PropertyListView<WeerVoorspelling>("weersvoorspelling", weerVoorspellingService.getWeerVoorspelling()) { 

       @Override 
       protected void populateItem(ListItem<WeerVoorspelling> item) { 
        item.add(new Label("dag")); 
        item.add(new StaticImage("typeVoorspelling", String.format("images/%s.png", item.getModelObject().getType()))); 
        item.add(new Label("minTemperatuur")); 
        item.add(new Label("maxTemperatuur")); 
       } 
      }; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     WebMarkupContainer containerWeer = new WebMarkupContainer("containerWeer"); 
     containerWeer.setOutputMarkupId(true); 
     containerWeer.add(hateView); 
     containerWeer.add(newview); 
     addOrReplace(containerWeer); 

     return containerWeer; 
    } 
} 
+0

你究竟想用你的AJAX調用做什麼?交換兩個列表視圖? – kgrad 2013-03-12 15:58:08

+0

不,根本沒有,在後臺即時通訊使用JSON解析來解析來自weatherstation的數據,該數據可以改變很多,所以我想更新propertyListview – 2013-03-12 16:09:11

回答

1

在你onTimer您要添加的對象本身進行改變它。我建議將視圖/容器再生轉換爲新方法。

然後redifine onTimer像這樣:

add(new AbstractAjaxTimerBehavior(Duration.seconds(10)) 
{ 
    @Override 
    protected final void onTimer(AjaxRequestTarget target) 
    { //createContainer() generates the views and container. 
     target.add(createContainer()); 
    } 
} 

編輯:
我會定義createContainer()像這樣:

private WebMarkupContainer createContainer() 
{ 
    final WeerService weerService = new WeerServiceImpl(); 

    PropertyListView<Weer> newview = new PropertyListView<Weer>("weer", weerService.getWeer()) 
    { 

    @Override 
    protected void populateItem(ListItem<Weer> item) 
    { 
     item.add(new Label("temperatuur")); 
     item.add(new StaticImage("type", String.format("images/%s.png", item.getModelObject().getType()))); 
     item.add(new Label("omschrijving")); 
    } 
    }; 

    WeerVoorspellingService weerVoorspellingService = new WeerVoorspellingServiceImpl(); 

    PropertyListView<WeerVoorspelling> hateView = new PropertyListView<WeerVoorspelling>("weersvoorspelling", weerVoorspellingService.getWeerVoorspelling()) 
    { 

    @Override 
    protected void populateItem(ListItem<WeerVoorspelling> item) 
    { 
     item.add(new Label("dag")); 
     item.add(new StaticImage("typeVoorspelling", String.format("images/%s.png", item.getModelObject().getType()))); 
     item.add(new Label("minTemperatuur")); 
     item.add(new Label("maxTemperatuur")); 
    } 
    }; 

    WebMarkupContainer containerWeer = new WebMarkupContainer("containerWeer"); 
    containerWeer.setOutputMarkupId(true); 
    containerWeer.add(hateView); 
    containerWeer.add(newview); 
    add(containerWeer); 

    return containerWeer; 
} 

編輯以滿足最終的解決方案

然後DEFI NE你Panel構造像這樣:

public WeerPanel(String id) throws IOException 
{ 
    super(id); 

    final WebMarkupContainer container = createContainer(); 

    add(new AbstractAjaxTimerBehavior(Duration.seconds(10)) 
    { 
    @Override 
    protected final void onTimer(AjaxRequestTarget target) 
    { //createContainer() generates the views and container. 
     container.addOrReplace(createContainer()); 
    } 
    } 
} 
+0

對不起,我剛開始Java就像3個星期前一樣,對我來說是艱難時期;)您建議採用哪種方法?你能舉一個小例子嗎?你還指的是名單? – 2013-03-12 19:03:44

+0

Thanx爲您的反應!如果它不適合我的低代表會給你信用。 – 2013-03-12 21:53:34

+0

仍然得到一個運行時錯誤 最後原因:id爲 'containerWeer' 已經存在一個孩子: [WeerPanel [組件id = weer] 認爲它是因爲該位: WebMarkupContainer containerWeer =新WebMarkupContainer( 「containerWeer」 ); containerWeer.setOutputMarkupId(true); containerWeer.add(hateView); containerWeer.add(newview); add(containerWeer); 每次調用方法時都會調用容器,我是對的嗎? :) – 2013-03-12 21:54:41

0

請看看在檢票口AJAX控制檯輸出,它可能會說的東西,一個ListView不能直接更新。另外,你可以在你更新Listview的地方添加代碼嗎?

+0

中的數據,它看起來像只更新標記文件或東西,我得到了logg,如果你想看看它 – 2013-03-12 18:41:09

0

根據文檔AjaxSelfUpdatingTimerBehavior有一個方法onTimer()。您需要實現此方法並將您希望更新的視圖添加到AjaxRequestTarget。這將刷新您希望更新的組件。 ajax事件目前什麼都沒有做,這就是爲什麼你什麼都看不到。

基本上,從高級角度來看,您想要更新控制listView的支持模型對象,然後當ajax計時器觸發時,您想要刷新該列表以顯示最新數據。

的代碼會是這個樣子:

 
containerWeer.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(5)){ 
    @Override 
    protected final void onTimer(AjaxRequestTarget target) { 
    target.addComponent(/The component you wish to refresh/); 
    } 
}); 

+0

試過了,但它沒有解決,看到我的代碼,如果我做對了:) – 2013-03-12 18:39:39

+0

嘗試設置newWeer組件上的outputMarkupId並將其添加到目標在ajax調用中,而不是刷新整個組件... – kgrad 2013-03-12 18:45:07

1

你得到了「資訊」只有一次:

PropertyListView<WeerVoorspelling> hateView 
    = new PropertyListView<WeerVoorspelling>("weersvoorspelling", 
     weerVoorspellingService.getWeerVoorspelling()) { .. } 

所以不管天氣如何變化的預測,你的ListView看起來還是在原來的列表。 你應該介紹一個間接:

IModel<List<WeerVoorspelling>> weerVoorspelling = new AbstractReadOnlyModel<List<WeerVoorspelling>> { 
    public List<WeerVoorspelling> getObject() { 
    return weerVoorspellingService.getWeerVoorspelling(); 
    } 
} 

PropertyListView<WeerVoorspelling> hateView 
    = new PropertyListView<WeerVoorspelling>("weersvoorspelling", 
     weerVoorspelling) { .. }