В приложении Wicket у меня есть модальное диалоговое окно, которое содержит простую форму и кнопку.Пользователь вводит значения (параметры отчета), а затем нажимает кнопку, которая запускает загрузку файла отчета (обычно PDF).(Все значения формы являются обязательными, и механизм проверки Wicket используется, чтобы убедиться, что пользователь ввел их до начала загрузки.)
Возможно, это лучше объяснить с помощью рисунка:
Я использую здесь 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, приведите пример того, как это сделать.