繁体   English   中英

使用BootstrapDownloadLink在Wicket中刷新面板

[英]Refresh panel in Wicket with BootstrapDownloadLink

我的问题很简单,但我不知道如何解决它。 我有一个feedbackPanel ,如果BootstrapDownloadLink失败,我想显示一条错误消息。 通过提交,我可以轻松地做到:

protected void onSubmit(AjaxRequestTarget target) {
    ...
    error("File_not_found");  //Wicket will print this on the feedback panel
    target.add(getModalPanel().getFeedbackPanel()); //But i need to refresh it first
}

但是按钮位于一个面板中,我用populateItem填充,这是我知道向它插入Bootstrap样式的唯一方法。 按钮的代码:

BootstrapDownloadLink downloadDocument = new BootstrapDownloadLink(IDITEMREPEATER, file) {                                  

    @Override
    public void onClick() {
        File file = (File)getModelObject();
        if(file.exists()) {
            IResourceStream resourceStream = new FileResourceStream(new org.apache.wicket.util.file.File(file));
            getRequestCycle().scheduleRequestHandlerAfterCurrent(new ResourceStreamRequestHandler(resourceStream, file.getName()));
        } else {
            error(getString("error_fichero_no_existe"));
            /// ???? need to refresh-> getModalPanel().getFeedbackPanel()
        }
    }


};
downloadDocument.setIconType(GlyphIconType.clouddownload);
downloadDocument.add(new AttributeModifier("title", getString("documentos.descargar")));
downloadDocument.add(new AttributeModifier("class", " btn btn-info negrita btn-xs center-block"));
downloadDocument.setVisible(Boolean.TRUE);
list.add(downloadDocument);

您可以从AjaxDownloadLink创建或扩展,例如此处

主要的想法是拥有一个执行下载的AjaxBehavior ,并获得一个public void onClick(AjaxRequestTarget target) ,您可以在其中添加FeedbackPanel

 downloadBehavior = new AbstractAjaxBehavior()
        {
            private static final long serialVersionUID = 3472918725573624819L;

            @Override
            public void onRequest()
            {
                [...]                   
                ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(
                        AjaxDownloadLink.this.getModelObject(), name);
                handler.setContentDisposition(ContentDisposition.ATTACHMENT);
                getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
            }
        };

并在onclick中使用该行为:

   @Override
    public void onClick(AjaxRequestTarget aTarget)
    {
        String url = downloadBehavior.getCallbackUrl().toString();

        if (addAntiCache) {
            url = url + (url.contains("?") ? "&" : "?");
            url = url + "antiCache=" + System.currentTimeMillis();
        }

        // the timeout is needed to let Wicket release the channel
        aTarget.appendJavaScript("setTimeout(\"window.location.href='" + url + "'\", 100);");
    }

您可以使用target.addChildren(getPage(), IFeedback.class) 这将在页面中将所有 IFeedback接口实例添加到AjaxRequestTarget。

您也可以使用FeedbackPanel.class而不是界面。

或者使用getPage().visit(new IVisitor() {...})查找特定的反馈面板,如果您不想添加其他不相关的面板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM