在基本註冊屏幕根據需要一組字段(帶按鈕寄存器記錄畫面)有兩個面板:驗證當它們中的至少一個被填充
數據面板:
地址面板:
我可以通過完成僅數據面板寄存器。沒有必要填寫地址面板。但是,如果至少填充了「地址」面板的一個字段,則應該需要在同一面板中的所有其他字段。
我怎樣才能做到這一點?
在基本註冊屏幕根據需要一組字段(帶按鈕寄存器記錄畫面)有兩個面板:驗證當它們中的至少一個被填充
數據面板:
地址面板:
我可以通過完成僅數據面板寄存器。沒有必要填寫地址面板。但是,如果至少填充了「地址」面板的一個字段,則應該需要在同一面板中的所有其他字段。
我怎樣才能做到這一點?
如果其他輸入已提交非空值,則需要檢查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}" />
首先,你應該一個方法添加到後臺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監聽器添加地址面板上的每個輸入部件在其上處理該組件,並更新地址面板。
-1不是說到目前爲止你已經嘗試過什麼,並沒有表現出任何代碼。 – Andre