Я предполагаю, что ваш рабочий процесс заключается в том, что обработчик отправки формы направляет страницу, которая возвращает поток (pdf) в методе onActivate. Я также предполагаю, что вы установили заголовки ответа так, чтобы файл загружался, а не открывался браузером.
если вы сделаете это, браузер обычно создает диалог «сохранить файл как», и текущая страница никогда не удаляется (не обновляется). вы никогда не получите ответный звонок, сообщающий, что файл также был загружен.
, следовательно, с помощью описанного выше рабочего процесса вы не сможете повторно включить свою кнопку в ответ на начало или завершение загрузки. это потому, что ответ потока - это не что иное, как произвольные двоичные данные, а не html / javascript, который может быть выполнен браузером. вы не можете вернуть смешанный ответ html / javascript + данные двоичного файла.
лучшее, чего вы можете добиться, - это отключить кнопку на некоторое время, а затем снова включить, чтобы предотвратить двойной щелчок. если вы не хотите добавлять слишком много сложности в ваше приложение, я рекомендую этот подход.
однако вы можете изменить рабочий процесс, вставив дополнительный запрос-ответ между отправкой формы и загрузкой.
т.е.. вместо прямого перехода на страницу, которая возвращает поток, вы можете перезагрузить текущую страницу, которая в свою очередь запрашивает загрузку:
- отправка вашей формы сохраняет ваши параметры генерации PDF в сеансе и возвращает ответ (перезагрузка страницы)
- новая страница загружается вместе с мета-обновлением или директивой скрипта для перенаправления на URL-адрес загрузки
- URL загрузки вызывается, возвращает ответ потока вместе с правильными заголовками, установленными для того, чтобы пользователь увидел диалоговое окно «Сохранить файл как»
Возможно, есть и другие подходы, которые также позволят достичь желаемой функциональности, однако шаблон будет таким же, так как вам потребуется дополнительный запрос-ответ между отправкой формы и загрузкой файла.
пс. на самом деле это не проблема гобеленов, вы столкнетесь с одной и той же проблемой независимо от фреймворка (если только фреймворк не сделает что-то особенное для обработки этого случая). именно так работает технология http / browser.