Не специально для 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>
(обратите внимание, что вам необходимо убедиться, что скрипт также перерисовывается с помощью 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')");
Никаких условных проверок не требуется, так как метод действия компонента не будет вызван в любом случае, если проверка не пройдена.