5

在基本注册屏幕(带有按钮注册记录屏幕)中有两个面板:

数据面板:

在此处输入图像描述

地址面板:

在此处输入图像描述

我可以通过仅完成“数据”面板来注册。不必填写地址面板。但是,如果至少填写了地址面板的一个字段,则应要求同一面板中的所有其他字段。

在此处输入图像描述

我怎样才能做到这一点?

4

2 回答 2

7

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>用于确切用途的验证器。另请参阅现场演示。根据您的问题标签,您正在使用 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}" />
于 2013-01-22T14:34:12.580 回答
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 侦听器,并更新地址面板。

于 2013-01-22T12:54:38.540 回答