【问题标题】:Possible to set the styleClass of a xp:control from validator class?可以从验证器类中设置 xp:control 的 styleClass 吗?
【发布时间】:2019-02-25 12:01:06
【问题描述】:

对于我为编辑框设置验证器的表单,例如:

<xp:inputText
    id="inpRiskFactors" 
    styleClass="inputEscalation"
    value="#{matterBean.matter.escRiskFactors}" 
    validator="#{matterValidators.valEscRiskFactors}"...

这是我的验证方法中的一个 sn-p:

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);
        }       
    }

我想知道是否可以通过此方法更改/设置调用组件(UIComponent 组件)的 styleclass 属性?

对于用户来说,最好在 xp:controls 上应用一些 CSS,这些 CSS 是必需的,但没有通过验证。

有人知道如何实现这一点吗?

【问题讨论】:

    标签: jsf xpages


    【解决方案1】:

    UIComponent 转换为XspInputTextsetStyleClass 方法的显式调用对我有用

    ((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) {}
    

    【讨论】:

      【解决方案2】:

      大多数(全部?)标准 XPages 控件都使用WAI-ARIA standard for validation,因此当控件无效时会自动将aria-invalid 属性设置为“true”。

      这意味着您可以使用 CSS 来设置输入控件的样式。例如,当控件无效时,您可以设置不同的背景颜色和边框样式:

      [aria-invalid=true] {
          background-color: #fee;
          border-color: red;
      } 
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2014-10-23
      • 1970-01-01
      相关资源
      最近更新 更多