Как начать загрузку файла и закрыть диалоговое окно (jQuery) в Wicket? - PullRequest
0 голосов
/ 16 ноября 2011

В приложении Wicket у меня есть модальное диалоговое окно, которое содержит простую форму и кнопку.Пользователь вводит значения (параметры отчета), а затем нажимает кнопку, которая запускает загрузку файла отчета (обычно PDF).(Все значения формы являются обязательными, и механизм проверки Wicket используется, чтобы убедиться, что пользователь ввел их до начала загрузки.)

Возможно, это лучше объяснить с помощью рисунка:

enter image description here

Я использую здесь jQuery UI Dialog (вместо ModalWindow от Wicket, который казался намного более неуклюжим и уродливым с точки зрения пользователя).

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

Текущая версия (нерелевантные биты опущены):

public class ReportDownloadLink extends Link {

    public ReportDownloadLink(String id, ReportDto report) {
        super(id);
        this.report = report;
    }

    @Override
    public void onClick() {
       IResourceStream resourceStream = new AbstractResourceStreamWriter() {
            @Override 
            public void write(OutputStream output) {
                try {
                    reportService.generateReport(output, report);
                } catch (ReportGenerationException e) {
            // ...
            }
        }

        @Override
        public String getContentType() {                        
            // ...
        }
    };

    ResourceStreamRequestTarget target = 
        new ResourceStreamRequestTarget(resourceStream, report.getFileName());
    getRequestCycle().setRequestTarget(target);
}

Диалог представляет собой панель калитки (которая использует ReportDownloadLink выше), которую мы помещаем в определенный div, а затем, когдаотчет выбирается в списке, диалог открывается из onClick () AjaxLink довольно просто так:

 target.appendJavascript(String.format("showReportExportDialog('%s')",  ... ));

, который вызывает эту функцию JS:

function showReportExportDialog(dialogTitle) {
    $("#reportExportPanelContainer").dialog(
        {modal:true, draggable:true, width: 320, height: 330, title: dialogTitle}
    );
}

Некоторые опции:

  • Заставьте ReportDownloadLink расширить что-то, кроме Link, возможно, и / или найти подходящий метод для переопределения, который позволил бы мне выполнить небольшой кусочек JavaScript, необходимый для закрытия диалога jQuery.
  • Исследуйте библиотеки jQuery + Wicket (например, jqwicket или wiquery ), которые, как предполагается, улучшают совместную работу этих двух.

Последнее, что я попробовал, это переопределение метода getOnClickScript () в ReportDownloadLink, который казался многообещающим (согласно Javadocs, он возвращает «Любой JavaScript onClick, который следует использовать»):

@Override
protected CharSequence getOnClickScript(CharSequence url) {
    return "closeDownloadDialog()";
}

Дело в том, что это приводит к тому, что onClick () вообще не вызывается, т. Е. Загрузка не начинается.

Могу ли я переопределить еще какой-нибудь класс "ajaxy" из Wicket (чем Link), чтобы объединить эти вещи: сначала инициализировать загрузку, затем вызвать JS для закрытиядиалог?

Есть ли какие-либо рекомендации или опыт в подобных случаях ?Обратите внимание, что я хочу продолжать использовать диалоговое окно jQuery, хотя оно усложняет подобные вещи.Использование DownloadLink ( см. Связанный вопрос ) также хорошо, если это облегчает задачу.

Примечание: если вы рекомендуете JQWicket или wiQuery, приведите пример того, как это сделать.

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Может быть, вы можете попытаться привязать модальный код закрытия к событию "click" кнопки, используя только JQuery, на странице вашей модальной панели добавьте что-то похожее на ${"#mySubmit").click(myCloseModalFunction). Он должен сохранить поведение Wicket по умолчанию и добавить модальное закрытие в микс.

Другой способ - переопределить метод getOnClickScript(...), но javascript должен вернуть true, чтобы браузер вызвал оценку продолжения ссылки и загрузил соответствующий href. Если вы вернете false, оценка останавливается. Я хотел бы предложить что-то вроде

@Override
protected CharSequence getOnClickScript(CharSequence url) {
    return "closeDownloadDialog();return true;";
}

Надеюсь, это поможет ...

0 голосов
/ 17 ноября 2011
...