PrimeFaces: conditional update on validation
Solution 1
The <h:message>
(or PrimeFaces' counterpart <p:message>
) is intented for this. Or, in your case maybe better, the <h:messages>
(or <p:messages>
).
public void submit() {
// ...
if (fail) {
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fail", null));
}
}
with
<h:messages id="messages" />
<p:commandLink process="@form" action="#{bean.submit}" update="messages something" />
Note that you're as well supposed to use a normal Validator
implementation to perform the validation. If it throws a ValidatorException
, then the action won't be invoked anyway. Doing validation inside action method is a smell.
Solution 2
I don't think the message
suggestion necessarily answers the question asked. Suppose he wants to update something OTHER than a message
?
I've not tried this myself, but another approach that might work is to use remotecommand
.
<p:remoteCommand id='good' update='goodUpdates'/>
<p:remoteCommand id='bad' update='badUpdate'/>
<p:commandButton oncomplete='if (your-test) good() else bad()'/>
Note, this would necessitate another round-trip to the server and thus performance is a consideration.
wrschneider
Updated on July 15, 2022Comments
-
wrschneider almost 2 years
Is it possible to conditionally update JSF components only when validation succeeds?
I would like to be able to do something like
<p:commandLink process="@form" listener="#{foo}" update="something somethingElse">
where "something" only gets updated if validation is successful.
Is there any way that can be done or is that just not supported in JSF?
I've been able to rig up kind of a hack with hidden commandLinks but not entirely satisfied:
<p:commandLink process="@form" listener="#{foo}" update="somethingElse" oncomplete="if (!args.validationFailed) $("#link").click();"> <p:commandLink style="display:none" id="link" update="something">