Первичные ссылки onclick и onsuccess
У меня следующая ситуация:
после нажатия кнопки выполняется некоторая бизнес-логика, и после ее завершения должна быть видима новая вкладка с отчетом.
<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
Я заметил, что 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
onclick вызывается до того, как запрос ajax даже создан (чистая клиентская сторона), в то время как oncomplete и onsuccess выполняются после того, как сервер ответил на запрос ajax. Итак, если вам нужно выполнить некоторую бизнес-логику, прежде чем показывать диалог, например, вы хотите пойти с неполным. Это то, что я всегда использую.
Вы также можете настроить свой javascript внутри oncomplete для выполнения только в случае отсутствия ошибок проверки. Интуитивно я думаю, что onsuccess будет вести себя так и выполняться только при отсутствии ошибок проверки, но это не так. Я не знаю разницы между ними. Я предполагаю, что есть способ отметить успех = false в резервной копии beans, но я не смог найти его в документации.
Если вы хотите проверить на подтверждение в своем атрибуте oncomplete, вот как вы это сделали:
oncomplete="if (!args.validationFailed){someDialog.hide()}"
В этом случае вы только закроете диалог, если поля будут правильно проверены. Фактически вы можете вводить параметры из резервной копии bean и использовать их в javascript после того, как запрос был подан. В вашей поддержке bean вы можете сделать что-то вроде этого:
RequestContext.getCurrentInstance().addCallbackParam("showDialog", false);
И вы можете получить доступ к этому параметру в своем неполном атрибуте:
oncomplete="if (args && args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"
Во всяком случае, я надеюсь, что это поможет.
Ответ 3
Здесь вы можете увидеть разницу:
Основные и события ajax onsuccess
или с onsuccess вы можете что-то сделать до полной загрузки DOM