可以从验证器 class 设置 xp:control 的 styleClass 吗?
Possible to set the styleClass of a xp:control from validator class?
对于表单,我已经为编辑框设置了验证器,例如:
<xp:inputText
id="inpRiskFactors"
styleClass="inputEscalation"
value="#{matterBean.matter.escRiskFactors}"
validator="#{matterValidators.valEscRiskFactors}"...
这是我的验证方法的一个片段:
public void valEscRiskFactors(FacesContext facesContext, UIComponent component, Object value) {
utils.printToConsole(this.getClass().getSimpleName().toString() + " - valEscRiskFactors(...), value = " + value.toString());
String msg = null;
if (value.toString().replaceAll("\s+","").equals("")){
msg = matterProp.getProperty("msg_valid_esc_risk_factors");
FacesMessage message = new FacesMessage(msg);
throw new ValidatorException(message);
}
}
我想知道我是否可以通过此方法 change/set 调用组件(UIComponent 组件)的样式类 属性?
对于用户来说,最好在需要的 xp:controls 上应用一些 CSS 并且不通过验证。
有人知道如何实现吗?
大多数(全部?)标准 XPages 控件使用 WAI-ARIA standard for validation,因此当控件无效时,会自动将 aria-invalid
属性 设置为 "true"。
这意味着您可以使用 CSS 来设置输入控件的样式。例如,当控件无效时,您可以设置不同的背景颜色和边框样式:
[aria-invalid=true] {
background-color: #fee;
border-color: red;
}
显式调用 UIComponent
的 setStyleClass
方法转换为 XspInputText
对我有效
((XspInputText)component).setStyleClass("my-class");
如果您不想转换但想将 styleClass
应用于任何支持此类 属性 的组件,java 反射可以提供帮助:
try {
Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
if (setStyleClass != null) {
setStyleClass.invoke(component, "my-class");
}
} catch (SecurityException e) {}
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}
您可能想要附加 styleClass 而不是替换
try {
String styleClass = null;
Method getStyleClass = component.getClass().getMethod("getStyleClass");
if (getStyleClass != null) {
styleClass = (String)getStyleClass.invoke(component, (Object[])null);
}
Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
if (setStyleClass != null) {
String newStyleClass = StringUtil.isNotEmpty(styleClass) ? styleClass.concat(" my-class") : "my-class";
setStyleClass.invoke(component, newStyleClass);
}
} catch (SecurityException e) {}
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}
对于表单,我已经为编辑框设置了验证器,例如:
<xp:inputText
id="inpRiskFactors"
styleClass="inputEscalation"
value="#{matterBean.matter.escRiskFactors}"
validator="#{matterValidators.valEscRiskFactors}"...
这是我的验证方法的一个片段:
public void valEscRiskFactors(FacesContext facesContext, UIComponent component, Object value) {
utils.printToConsole(this.getClass().getSimpleName().toString() + " - valEscRiskFactors(...), value = " + value.toString());
String msg = null;
if (value.toString().replaceAll("\s+","").equals("")){
msg = matterProp.getProperty("msg_valid_esc_risk_factors");
FacesMessage message = new FacesMessage(msg);
throw new ValidatorException(message);
}
}
我想知道我是否可以通过此方法 change/set 调用组件(UIComponent 组件)的样式类 属性?
对于用户来说,最好在需要的 xp:controls 上应用一些 CSS 并且不通过验证。
有人知道如何实现吗?
大多数(全部?)标准 XPages 控件使用 WAI-ARIA standard for validation,因此当控件无效时,会自动将 aria-invalid
属性 设置为 "true"。
这意味着您可以使用 CSS 来设置输入控件的样式。例如,当控件无效时,您可以设置不同的背景颜色和边框样式:
[aria-invalid=true] {
background-color: #fee;
border-color: red;
}
显式调用 UIComponent
的 setStyleClass
方法转换为 XspInputText
对我有效
((XspInputText)component).setStyleClass("my-class");
如果您不想转换但想将 styleClass
应用于任何支持此类 属性 的组件,java 反射可以提供帮助:
try {
Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
if (setStyleClass != null) {
setStyleClass.invoke(component, "my-class");
}
} catch (SecurityException e) {}
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}
您可能想要附加 styleClass 而不是替换
try {
String styleClass = null;
Method getStyleClass = component.getClass().getMethod("getStyleClass");
if (getStyleClass != null) {
styleClass = (String)getStyleClass.invoke(component, (Object[])null);
}
Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
if (setStyleClass != null) {
String newStyleClass = StringUtil.isNotEmpty(styleClass) ? styleClass.concat(" my-class") : "my-class";
setStyleClass.invoke(component, newStyleClass);
}
} catch (SecurityException e) {}
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}