PrimeFaces:验证的条件更新

时间:2012-03-09 17:18:53

标签: ajax validation jsf primefaces

是否可以仅在验证成功时有条件地更新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">

2 个答案:

答案 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,则无论如何都不会调用该动作。在动作方法中进行验证是一种气味。