У меня следующая ситуация:
после нажатия кнопки выполняется некоторая бизнес-логика, и после этого должна быть видна новая вкладка с отчетом.
<p:commandButton value="this button" update="growlMain"
actionListener="#{myBean.businesslogic}"
onstart="ajaxDialog.show();"
oncomplete="ajaxDialog.hide();"
onsuccess="window.open('./report.jsp', '_newtab');" />
Это не работает :(
Если бизнес-логика длится всего несколько миллисекунд, работает следующее:
<p:commandButton value="this button" update="growlMain"
actionListener="#{myBean.fastbusinesslogic}"
onclick="window.open('./report.jsp', '_newtab');" />
onclick открывает новую вкладку, а также такие вещи, как onstart, но не работает с onsuccess или oncomplete. Почему? И есть ли решение для бизнес-логики, которое длится несколько секунд?
Ответ 1 · рейтинг 8 · Gunjan Kalra
Я заметил, что кнопка onsuccess для PrimeFaces не работает. Однако oncomplete работает и делает все необходимое, даже если есть ошибка, например, в моем случае показывает диалоговое окно успеха, даже если в моей бизнес-логике есть ошибка. Пытался использовать onsuccess, но не работает. Вы можете попробовать завершить, как показано ниже:
<p:commandButton value="this button" update="growlMain"
actionListener="#{myBean.businesslogic}"
onstart="ajaxDialog.show();"
oncomplete="ajaxDialog.hide(); window.open('./report.jsp', '_newtab');"/>
Ответ 2 · рейтинг 35 · Andre
onclick вызывается еще до создания запроса ajax (чистая клиентская сторона), а oncomplete и onsuccess выполняются после того, как сервер ответил на запрос ajax. Итак, если вам нужно выполнить некоторую бизнес-логику, например, перед отображением диалога, вы хотите использовать oncomplete. Это то, что я всегда использую.
Вы также можете настроить свой javascript внутри oncomplete так, чтобы он выполнялся только в том случае, если нет ошибок проверки. Интуитивно я думаю, что onsuccess будет вести себя так и выполняться только при отсутствии ошибок проверки, но это не так. Я действительно не знаю разницы между ними. Я предполагаю, что есть способ пометить success=false в поддерживающих bean-компонентах, но я не смог найти его в документации.
Если вы хотите проверить правильность своего атрибута oncomplete, сделайте следующее:
oncomplete="if (!args.validationFailed){someDialog.hide()}"
В этом случае вы закроете диалоговое окно только в том случае, если поля правильно проверены. На самом деле вы можете вводить параметры из вспомогательного компонента и использовать их в javascript после того, как запрос был обслужен. В вашем поддерживающем компоненте вы можете сделать что-то вроде этого:
RequestContext.getCurrentInstance().addCallbackParam("showDialog", false);
И вы можете получить доступ к такому параметру в своем неполном атрибуте:
oncomplete="if (args && args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"
Во всяком случае, я надеюсь, что это поможет.