onsuccess
запускается, если сам запрос ajax был успешным (т. Е. Нет сетевых ошибок, необработанных исключений и т. Д.), А не если метод действия был успешно вызван.
Учитывая <p:dialog widgetVar="testDialog">
Вы можете удалить onsuccess
и заменить его на PrimeFaces RequestContext#execute()
внутри saveMethod()
:
if (success) {
RequestContext.getCurrentInstance().execute("PF('testDialog').hide()");
}
Примечание: PF()
была введена в PrimeFaces 4.0,В более старых версиях PrimeFaces вам нужно вместо этого testDialog.hide()
.
Если вы предпочитаете не загромождать контроллер скриптами, специфичными для вида, вы можете использовать oncomplete
, который предлагает объект args
, который имеет логическое значениеvalidationFailed
свойство:
<p:commandButton ...
oncomplete="if (args && !args.validationFailed) PF('testDialog').hide()" />
Проверка if (args)
необходима, поскольку она может отсутствовать при возникновении ошибки ajax и, таким образом, вызывать новую ошибку JS при попытке получить от нее validationFailed
;&
вместо &
является обязательным по причине, объясненной в в этом ответе , при необходимости рефакторинг JS-функции, которую вы вызываете, например oncomplete="hideDialogOnSuccess(args, testDialog)"
, как показано в Keepоткрыть, если проверка не удалась .
Это последнее решение (с небольшой перепиской) должно работать для простого jsf h:commandButton
в сочетании с f:ajax
Это неудачночто PrimeFaces не поддерживает то, что RichFaces уже поддерживает: переоценка EL во время запроса в атрибутах on*
.В противном случае вы также можете сделать это:
<p:commandButton ...
oncomplete="if (#{not facesContext.validationFailed}) PF('testDialog').hide()" />