是否可以仅在验证成功时有条件地更新JSF组件?
我希望能够做类似
的事情<p:commandLink process="@form" listener="#{foo}"
update="something somethingElse">
如果验证成功,“something”只会更新。
有什么办法可以做,或者只是JSF不支持?
我已经能够通过隐藏的commandLink来修复一些黑客但不完全满意:
<p:commandLink process="@form" listener="#{foo}"
update="somethingElse" oncomplete="if (!args.validationFailed) $("#link").click();">
<p:commandLink style="display:none" id="link"
update="something">
答案 0 :(得分:3)
我认为message
建议不一定能回答问题。假设他想更新除message
以外的其他内容?
我自己没有尝试过,但另一种可行的方法是使用remotecommand
。
<p:remoteCommand id='good' update='goodUpdates'/>
<p:remoteCommand id='bad' update='badUpdate'/>
<p:commandButton oncomplete='if (your-test) good() else bad()'/>
请注意,这将需要另一次往返服务器,因此性能是一个考虑因素。
答案 1 :(得分:2)
<h:message>
(或PrimeFaces'对应<p:message>
)的目的是为此。或者,在您的情况下,可能更好,<h:messages>
(或<p:messages>
)。
public void submit() {
// ...
if (fail) {
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fail", null));
}
}
与
<h:messages id="messages" />
<p:commandLink process="@form" action="#{bean.submit}" update="messages something" />
请注意,您应该使用正常的Validator
实现来执行验证。如果它抛出ValidatorException
,则无论如何都不会调用该动作。在动作方法中进行验证是一种气味。