Первичные ссылки 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 &amp;&amp; args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"

Во всяком случае, я надеюсь, что это поможет.