Отличия Primefaces 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. Почему? И есть ли решение для бизнес-логики, которое длится несколько секунд?


person Ziagl    schedule 13.09.2011    source источник
comment
Ваш вопрос сбивает с толку... что вы имеете в виду под бизнес-логикой, которая длится несколько секунд? Вы говорите, что хотите вызвать window.open('./report.jsp', '_newtab'); после завершения действия actionListener businessLogic на стороне сервера?   -  person maple_shaft    schedule 13.09.2011


Ответы (3)


Я заметил, что кнопка 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');"/>
person Gunjan Kalra    schedule 03.11.2011

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 &amp;&amp; args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"

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

person Andre    schedule 02.02.2012
comment
Мне нужно было избежать символов &: oncomplete=if (args args.showDialog){ dialog1.show() }else{ alert('бин не позволил мне открыть диалог')} - person 8bitjunkie; 17.01.2013

Вы можете увидеть разницу здесь:

Событие Primefaces и ajax onsuccess

или в случае успеха вы можете что-то сделать до полной загрузки DOM

person makkasi    schedule 06.05.2013