Ответ 1
Не специально для required="true"
, но вы можете проверить #{facesContext.validationFailed}
, если валидация вообще не удалась. Если вы совпадаете с этим, проверяя, нажата ли кнопка, нажатая #{not empty param[buttonClientId]}
, вы можете сместить ее в атрибут rendered
<h:outputScript>
следующим образом:
<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}">
<f:ajax execute="@form" render="@form someTable" />
</h:commandButton>
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}">
$("#dialog_id").dialog("close");
</h:outputScript>
(обратите внимание, что вам нужно убедиться, что script также повторно отображается командой f: ajax)
Немного взломанный, но его невозможно обработать в функции onevent
, поскольку стандартная реализация JSF не предоставляет никакой информации о состоянии проверки в ответе ajax.
Если вы используете RichFaces, тогда вы можете просто использовать EL в атрибуте oncomplete
кнопки/ссылки команды <a4j:xxx>
. Они оцениваются по принципу "за запрос", а не по принципу "за просмотр", как в стандартных JSF и PrimeFaces:
<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $('#dialog_id').dialog('close')" />
Или, если вы используете PrimeFaces, вы можете воспользоваться тем фактом, что PrimeFaces расширяет ответ ajax с помощью дополнительного атрибута args.validationFailed
, который вводится прямо в область JavaScript атрибута oncomplete
:
<p:commandButton ... oncomplete="if (args && !args.validationFailed) $('#dialog_id').dialog('close')" />
(обратите внимание, что &
используется вместо &
, потому что &
является специальным символом в XML/XHTML)
Или вы можете использовать API-интерфейс PrimeFaces RequestContext
в методе действий bean для программного выполнения JavaScript в визуализированном представлении.
RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')");
Никаких условных проверок не требуется, поскольку метод действия bean не будет вызываться в любом случае, когда проверка не выполнена.