2013-03-12 4 views
3

У меня есть данные, которые входят в мой PropertyListview, есть контейнер вокруг него, но когда я хочу обновить его с помощью Ajax, он ничего не делает! Как мне обновить PropertyListview с помощью Ajax?Wicket - Ajax PropertyListView

EDIT в фоновом режиме им с помощью 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); 
     } 
    }); 
} 

}

Это какой-то код, который я делаю в фоновом режиме, его манекен, который каждый раз меняет температуру погоды случайным числом.

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

Фиктивный код отлично, но до сих пор нет ничего изменений, чтобы увидеть на моей странице .... как если бы мой список разве получать новые данные ..

FIXED здесь код для людей, которые найдут это удобный

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

+0

Нет, совсем нет, в фоновом режиме, используя JSON Parse для анализа данных с метеостанции, данные могут сильно изменяться, поэтому я хочу обновить данные в propertyListview –

ответ

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()); 
    } 
} 

EDIT:
Я бы определил 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; 
} 

Edited, чтобы соответствовать окончательному решению

Тогда Defi пе ваш 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 недели назад, тяжелые времена для меня;) что вы предлагаете поместить в этот метод? не могли бы вы сделать небольшой пример? Вы также имеете в виду списки? –

+0

Thanx для вашей реакции! дал бы вам кредиты, если бы это было не для моего низкого представителя. –

+0

все еще получают сообщение об ошибке выполнения Последней причины: Ребенок с идентификатором 'containerWeer' уже существует: [WeerPanel [Component ID = Weer]] думают его потому, что этот бит: WebMarkupContainer containerWeer = новый WebMarkupContainer ("containerWeer"); containerWeer.setOutputMarkupId (true); containerWeer.add (hateView); containerWeer.add (newview); add (containerWeer); делает контейнер каждый раз, когда вызывается метод, верно? :) –

0

Пожалуйста, посмотрите на выходе в консоли калитка АЯКС, это, вероятно, что-то говорит, что ListView не может быть обновлена ​​непосредственно. Кроме того, можете ли вы добавить код, в котором вы обновляете Listview?

+0

, похоже, что он только обновляет файл разметки или что-то, я получил логг, если вы хотите взглянуть на него –

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

Пробовал, но он не сработал, см. мой код, если я сделал это правильно :) –

+0

Попробуйте настроить outputMarkupId на newWeer-компоненте и добавить его к цели в вызове ajax вместо обновления всего компонента ... – kgrad

1

Вы получаете «WeerVoorspelling» только один раз:

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) { .. } 
Смежные вопросы