2014-11-06 4 views
1

Теперь, после Wicket: FileUploadField with ListView, мне нужно разрешить пользователю удалять файлы по одному с помощью кнопки рядом с FileUploadField.Wicket: FileUpload delete with RepeatingView

Он работает должным образом, когда файлы уже были сохранены, но не тогда, когда они были FileUploadField в сброшена ...

Так что я попытался это:

AjaxLink<Void> deleteLink = new AjaxLink<Void>("deleteLink") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void onClick(AjaxRequestTarget target) {  
       EtdConfigForm parent = (EtdConfigForm)EtdDokumentRowForm.this.getParent().getParent().getParent().getParent().getParent(); 
       EtdDokumentRowPanel panel = (EtdDokumentRowPanel)EtdDokumentRowForm.this.getParent(); 
       parent.removeDokument(panel); 
       target.prependJavascript("var itemRemove = document.getElementById('"+ panel.getMarkupId() + "');" + 
         "itemRemove.parentNode.removeChild(itemRemove);" + 
         "Wicket.$('" + panel.getParent().getParent().getMarkupId() + "').children('"+ panel.getMarkupId()+"').remove();"); 
       target.addComponent(parent); 
      } 
     }; 
     add(deleteLink); 

Но это не работает ... Я имею в виду кусок ajax ... что я делаю неправильно?

ответ

1

Во-первых, вам следует избегать таких цепных вызовов метода, основанных на расположении текущего компонента, потому что он вообще не является гибким.

Чтобы найти типизированный родительский компонент, вы можете использовать метод findParent(final Class<Z> c) компонента.

На самом деле, я не могу понять, где находится ваш AjaxLink, но я думаю, он должен быть непосредственно на EtdDokumentRowPanel близко к FileUploadField.

Итак, чтобы удалить весь EtdDokumentRowPanel, вы должны сначала удалить его с RepeatingView и выполнить скрипт с удалением разметки. Конечно, если вы сохранили эту панель где-то еще (в EtdConfigForm, я полагаю), то ее также следует удалить.

Чтобы не искать RepeatingView в родительских объектах, лучше передать их каждому из EtdDokumentRowPanel через конструктор.

Это будет что-то вроде этого:

public class EtdDokumentRowPanel extends Panel 
{ 
    ... 
    public EtdDokumentRowPanel (String id, EtdDokument doc, final RepeatingView view) 
    { 
     //your panel should have markup id: 
     setOutputMarkupId (true); 
     ... 
     AjaxLink<Void> deleteLink = new AjaxLink<Void> ("deleteLink") 
     {  
      @Override 
      public void onClick (AjaxRequestTarget target) 
      { 
       EtdDokumentRowPanel thisPanel = EtdDokumentRowPanel.this; 

       // removing row panel from RepeatingView: 
       view.remove (thisPanel); 

       // execute this js to remove child from Wicket parent component: 
       target.prependJavascript ( 
         "Wicket.$('" + view.getParent().getMarkupId() + "')" + 
         ".removeChild(Wicket.$('" + thisPanel.getMarkupId() + 
         "'));");  
      } 
     }; 
     add (deleteLink); 
     ... 
    } 
} 
+1

Да, кнопка на панели строки. Большое спасибо за вашу любезную помощь. – diminuta