Primefaces onclick и onsuccess различия - PullRequest
       3

Primefaces onclick и onsuccess различия

16 голосов
/ 13 сентября 2011

У меня следующая ситуация:

после нажатия кнопки выполняется некоторая бизнес-логика, и после этого должна появиться новая вкладка с отчетом.

<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');" />

при щелчке мышью открывается новая вкладка, например, onstart, но она неработать с onsuccess или oncomplete. Почему? И есть ли решение для бизнес-логики, которое длится несколько секунд?

Ответы [ 3 ]

33 голосов
/ 02 февраля 2012

onclick вызывается еще до того, как будет создан запрос ajax (чисто клиентская сторона), тогда как oncomplete и onsuccess выполняются после того, как сервер ответил на запрос ajax.Так что, если вам нужно выполнить некоторую бизнес-логику, например, перед отображением диалога, вы должны перейти к oncomplete.Это то, что я всегда использую.

Вы также можете настроить свой javascript внутри oncomplete для выполнения, только если нет ошибок проверки.Интуитивно я думаю, что onsuccess будет вести себя так и будет выполняться только тогда, когда нет ошибок валидации, но это не так.Я действительно не знаю разницу между ними.Я предполагаю, что есть способ пометить success = false в бинах bean, но я не смог найти его в документации.

Если вы хотите проверить проверку в вашем атрибуте oncomplete, вот как вы 'd do:

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')}"

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

7 голосов
/ 03 ноября 2011

Я заметил, что кнопка onsuccess for PrimeFaces не работает.Однако oncomplete работает и выполняет необходимые функции, даже если есть ошибка, например, в моем случае отображается диалоговое окно успеха, даже если в моей бизнес-логике есть ошибка.Пытался использовать onsuccess, но не работает.Вы можете попробовать завершить как показано ниже:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide(); window.open('./report.jsp', '_newtab');"/>
1 голос
/ 06 мая 2013

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

Primefaces и событие ajax onsuccess

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...