我正在使用 JSF 2.0。
我的页面上有一个 h:selectOneMenu
,其中包含值列表,并且同一页面上有一个 h:inputText
,其 required
应取决于 h:selectOneMenu
当前选择的值。只有一组特定的值应该触发必需的
检查,其他值则不会。
这是我尝试过的:
<h:inputText ... required="#{(selectedPaymentType.value == 'some value') || (selectedPaymentType.value == 'other value')}" />
在上面的代码中,#{selectedPaymentType}
是在 h:selectOneMenu 绑定(bind)
中定义的。
还有 3 个类似的值,它们应该将 required
属性触发为 true
。这看起来有点笨拙。有更好的方法吗?
最佳答案
Fant 已经给出了正确方向的提示,您应该使用具有 required
的枚举。属性,但似乎您并不完全确定如何正确实现它。诚然,范特的回答还不够详尽。所以这里有一个更详细的答案。
基本上,您需要将所有下拉值替换为如下所示的枚举:
public enum PaymentType {
FOO("Some label for foo", true),
BAR("Some label for bar", false),
BAZ("Some label for baz", true);
private String label;
private boolean required;
private PaymentType(String label, boolean required) {
this.label = label;
this.required = required;
}
public String getLabel() {
return label;
}
public boolean isRequired() {
return required;
}
}
并按如下方式使用
<h:selectOneMenu binding="#{selectedPaymentType}" value="#{bean.selectedPaymentType}">
<f:selectItems value="#{bean.availablePaymentTypes}" var="paymentType"
itemValue="#{paymentType}" itemLabel="#{paymentType.label}" />
</h:selectOneMenu>
<h:inputText ... required="#{selectedPaymentType.value.required}" />
与
private PaymentType selectedPaymentType; // +getter+setter
public PaymentType[] getAvailablePaymentTypes() {
return PaymentType.values();
}
(或者如果您使用 OmniFaces,请使用 <o:importConstants>
,那么您不需要 <f:selectItems>
这样的 getter ;不,您在任何情况下都不需要转换器,JSF/EL 已经内置了枚举转换)
看,required
属性现在更加简化,因为它已经在与所选值关联的模型中定义。
关于java - 如何让h的required属性为:inputText depend on certain set of values from h:selectOneMenu?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500213/