2013-01-22 78 views
4

在基本註冊屏幕根據需要一組字段(帶按鈕寄存器記錄畫面)有兩個面板:驗證當它們中的至少一個被填充

數據面板:

enter image description here

地址面板:

enter image description here

我可以通過完成僅數據面板寄存器。沒有必要填寫地址面板。但是,如果至少填充了「地址」面板的一個字段,則應該需要在同一面板中的所有其他字段。

enter image description here

我怎樣才能做到這一點?

+0

-1不是說到目前爲止你已經嘗試過什麼,並沒有表現出任何代碼。 – Andre

回答

4

如果其他輸入已提交非空值,則需要檢查required屬性。由於這可能會導致相當多的樣板,因此這裏只有一個只有3個輸入組件的啓動示例。

<h:form id="form"> 
    <h:inputText id="input1" value="#{bean.input1}" required="#{empty param['form:input2'] and empty param['form:input3']}" /> 
    <h:inputText id="input2" value="#{bean.input2}" required="#{empty param['form:input1'] and empty param['form:input3']}" /> 
    <h:inputText id="input3" value="#{bean.input3}" required="#{empty param['form:input1'] and empty param['form:input2']}" /> 
</h:form> 

一種替代方法是在組件綁定到視圖和使用UIInput#getValue()檢查以前的組件的值和UIInput#getSubmittedValue()檢查它們對下一個組件(組件如它們出現在部件的順序,即處理樹)。這樣你就不需要對客戶端ID進行硬編碼。您只需確保綁定名稱與現有的託管bean名稱不衝突。

<h:inputText binding="#{input1}" value="#{bean.input1}" required="#{empty input2.submittedValue and empty input3.submittedValue}" /> 
<h:inputText binding="#{input2}" value="#{bean.input2}" required="#{empty input1.value and empty input3.submittedValue}" /> 
<h:inputText binding="#{input3}" value="#{bean.input3}" required="#{empty input1.value and empty input2.value}" /> 

你會明白,當你有越來越多的組件時,這會產生醜陋的樣板。 JSF實用程序庫OmniFaces有一個確切的目的驗證程序<o:validateAllOrNone>。另請參閱live demo。根據您的quesiton標籤,你使用OmniFaces,所以你應該已經與眼前這個設置:

<o:validateAllOrNone components="input1 input2 input3" /> 
<h:inputText id="input1" value="#{bean.input1}" /> 
<h:inputText id="input2" value="#{bean.input2}" /> 
<h:inputText id="input3" value="#{bean.input3}" /> 
1

首先,你應該一個方法添加到後臺bean是這樣的:

public boolean isAddressPanelRequired() { 
    // Check if at least one field is entered 
    // and return true if it is and false othervise 
} 

地址面板上的每個輸入元素應該有required="#{backingBean.addressPanelRequired}"

接着的onblur AJAX監聽器添加地址面板上的每個輸入部件在其上處理該組件,並更新地址面板。

相關問題