java - Wicket:使用 RepeatingView 删除 FileUpload

标签 java file-upload wicket

已关注 Wicket: FileUploadField with ListView现在我需要允许用户使用 FileUploadField 旁边的按钮逐一删除文件。

当文件已经保存时它可以正常工作,但是当文件没有保存时​​,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部分...我做错了什么?

最佳答案

首先,您应该避免根据当前组件的位置对该方法进行这种链式调用,因为它根本不灵活。

要查找类型化的父组件,您可以使用组件的 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 );
        ...
    }
}

关于java - Wicket:使用 RepeatingView 删除 FileUpload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26780574/

相关文章:

java - 如何从mysql中的两个表中获取值,其中一个表不同,另一个表多个值?

c# - 如何让FileUpload控制点击 'Browse'后立即上传文件?

c++ - 使用 HTTP 方法 POST 或 PUT 上传数据

javascript - 将文件上传到网站,调用Python脚本并以最轻量的方式下载生成的新文件

java - 使用线程进度更新 Wicket 页面

java - 将对象反序列化到 PC 文件系统并用作资源?

javas内存使用无法释放

java - 子报表不显示

java - 让 Wicket AjaxButton 与浏览器自动完成功能配合使用

session - 使用 wicket-auth-roles 时在 session 过期时向用户显示消息