2013-01-04 53 views
1

我有一個h:selectOneListbox,它具有屬性required="true"。客戶端驗證a4j:ajax工作正常。如何使用ajax檢查驗證錯誤並作出反應

如果完成了有效的選擇,則會呈現另一個面板組。

例子:

<h:selectOneListbox 
.... 
id="first" 
.... 
required="true" 
> 
<a4j:ajax event="valueChange" render="secondGroup" listener="#{myController.anotherMethodINeed}"/> 
</h:selectOneListbox> 

<!-- the other panel --> 


<h:panelGroup id="secondGroup" layout="none"> 
    <h:panelGroup id="secondGroupCheck" layout="none" rendered="#{not empty model.first}"> 

    </h:panelGroup> 
</h:panelGroup> 

這也適用。

這裏的問題:

如果現在用戶選擇在所述第一選擇框(像一個空一個)一個非法值,則輸入客戶端側驗證。因此,這些信息從來不會對模型產生影響。在第一個有效的輸入之後,面板總是被渲染。沒有辦法讓它再次消失,因爲服務器不知道更改。

我知道的唯一解決方法是爲這樣的字段進行自定義驗證。如果需要渲染面板,驗證器會設置一個標誌。這個標誌可以用來決定是否應該渲染面板組。

有沒有更聰明的方法來做到這一點?

我知道我可以使用類似rendered="#{not facesContext.validationFailed}"的東西來檢查所有的字段,但我不知道只檢查一個字段的方法。

回答

1

如果UIInput組件在驗證階段拋出ValidatorException,則JSF將自動調用UIInput#setValid()false。這意味着您可以在視圖中使用UIInput#isValid()來檢查特定組件是否已通過驗證。

您可以使用binding屬性將UIInput組件綁定到視圖,然後通過EL方式訪問其所有屬性。

<h:selectOneListbox id="first" binding="#{first}" ... required="true"> 
    ... 
    <a4j:ajax listener="#{myController.anotherMethodINeed}" render="secondGroup" /> 
</h:selectOneListbox> 

<h:panelGroup id="secondGroup"> 
    <h:panelGroup id="secondGroupCheck" rendered="#{not empty model.first and first.valid}"> 
     ... 
    </h:panelGroup> 
</h:panelGroup> 

順便說一句,在layout="none"<h:panelGroup>無效的屬性,所以我省略了。另外,event="valueChange"<a4j|f:ajax>內部UIInput組件的默認值,所以我省略了它。

+0

Thx。 JSF 2有一個非常陡峭的學習曲線... –

+0

不客氣。 – BalusC