2013-09-09 7 views
1

Я хочу использовать ListView с AjaxSelfUpdatingTimerBehavior. У меня есть форма, которая принимает местоположение и некоторые файлы для загрузки с помощью MultiFileUploadField. После этого у меня есть веб-сервис, который будет хранить их. Поэтому, когда я нажимаю кнопку «Отправить», у меня появляется модальное окно. Он содержит мой список. Этот список необходимо обновить, когда веб-служба будет выполнена. Моя проблема в том, что когда я устанавливаю AjaxSelfUpdatingTimerBehavior, когда я его пытаюсь, он ждет число секунд, указанное в new AjaxSelfUpdatingTimerBehavior, тогда список исчезает. Я пробовал этоWicket ListView с AjaxSelfUpdateTimerBehaviour

[1]: https://cwiki.apache.org/confluence/display/WICKET/How+to+repaint+a+ListView+via+Ajax но зря. Я использую Wicket 6.8.0.

Вот разметке

<div class="modal-body" style="display: table-cell;"> 

    <table wicket:id="wholeTable">  
     <tr wicket:id="files"> 
      <td width="30"><span wicket:id="ajaxSpinner"><img 
        src="../img/ajax-loader.gif" /></span><span 
       wicket:id="orderValid"><img 
        src="../img/ok-16.png" /></span><span 
       wicket:id="orderFailed"><img 
        src="../img/ok-16.png" /></span></td> 
      <td wicket:id="container" style="opacity:0.4"><span wicket:id="putMessage"></span></td> 
     </tr> 
    </table> 
</div> 

А вот код Java

WebMarkupContainer wholeTable = new WebMarkupContainer("wholeTable"); 

    IModel<ArrayList<FileUpload>> inputFilesModel = new LoadableDetachableModel<ArrayList<FileUpload>>() { 

     @Override 
     protected ArrayList<FileUpload> load() { 
      return (ArrayList<FileUpload>) inputFiles; 
     } 

    }; 
    ListView<FileUpload> fileList = new ListView<FileUpload>("files", inputFilesModel) { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     @Override 
     protected void populateItem(final ListItem<FileUpload> item) { 
      final FileUpload file = (FileUpload) item.getModelObject(); 
      WebMarkupContainer container = new WebMarkupContainer("container"); 
      item.add(container); 
      item.add(new WebMarkupContainer("ajaxSpinner")); 
      item.add(new WebMarkupContainer("orderValid")); 
      item.add(new WebMarkupContainer("orderFailed")); 
      item.get("orderValid").setVisible(false); 
      item.get("orderFailed").setVisible(false); 
      container.add(new Label("putMessage", "dépôt de l'archive " + file.getClientFileName())); 
     } 
    }; 
    wholeTable.setOutputMarkupId(true); 
    // Update the whole panel every two second 
    wholeTable.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1))); 
    wholeTable.add(fileList); 
    target.add(wholeTable); 
    add(wholeTable); 

Я надеюсь, что я ясно.

Заранее благодарим за ваши ответы и извините, если мой английский плохой.

+0

Не проблема, что второй раз при загрузке 'inputFiles' этот список пуст? Причинение таблицы для отображения пустого списка, т. Е. Не отображать какой-либо элемент. – Buurman

+0

Я не думал об этом. Как я могу сделать это, чтобы он не загружался во второй раз или не загружал то, что не было пустым во второй раз ?. Спасибо – hamid

+0

Это зависит от того, как заполняется 'inputFiles'. Можете ли вы показать код, окружающий этот список? – Buurman

ответ

0

Я верю, что для правильного использования AjaxSelfUpdatingTimerBehavior вы должны переопределить метод onTimer (AjaxRequestTarget) и добавить элементы, которые вы хотите обновить (в вашем случае - wholeTable), к AjaxRequestTarget.

EDIT:

Изменение вашей линии:

wholeTable.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1))); 

To:

wholeTable.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)) { 
    @Override 
    protected void onTimer(AjaxRequestTarget target) { 
     target.add(wholeTable); 
    } 
}); 
+1

Я не вижу, как это сделать. Я попытался расширить AjaxSelfUpdatingTimerBehavior, но я не мог переопределить метод onTimer, так как я использую wicket 6.8.0 и, как это сказано здесь [doc] (http://ci.apache.org/projects/wicket/apidocs/6.0.x /org/apache/wicket/ajax/AjaxSelfUpdatingTimerBehavior.html), этот метод является окончательным. Итак, как я могу переопределить его, и вы могли бы более конкретно относиться к содержимому переопределенного метода. Спасибо – hamid

+0

Проверьте мои изменения. В документе doc вы связали метод onTimer(), отмеченный как защищенный, не являющийся окончательным. –

+0

Еще раз спасибо за ваш ответ, но, как я уже сказал, он окончательный. Пожалуйста, см. В документе, я связал детали метода onTimer(), вы найдете его окончательным. Но я также расширил класс AbstractAjaxTimerBehavior и поместил в него [AjaxSelfUpdateTimerBehaviour.java] (http://grepcode.com/file/repo1.maven.org/maven2/org.apache.wicket/wicket-core/6.8.0/ org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java # AbstractAjaxTimerBehavior) и добавили к методу onTimer() указанную вами строку. – hamid