在基本注册屏幕(按钮注册记录屏幕)中有两个面板:
数据面板:
地址面板:
我只需填写数据面板即可注册。没有必要填写“地址”面板。但是,如果填充了“地址”面板的至少一个字段,则应该需要同一面板中的所有其他字段。
我怎样才能做到这一点?
答案 0 :(得分:5)
如果其他输入提交了非空值,则需要签入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 :(得分: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侦听器,处理该组件,并更新地址面板。