代码之家  ›  专栏  ›  技术社区  ›  Patrick Kwinten

可以从验证器类设置xp:控件的styleClass吗?

  •  0
  • Patrick Kwinten  · 技术社区  · 7 年前

    对于表单,我为编辑框设置了validaor,例如:

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

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

    对于用户来说,在xp上应用一些CSS是很好的:这些控件是必需的,并且没有通过验证。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Stanislaw Guzik    7 年前

    明确要求 setStyleClass 方法 UIComponent 铸造到 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) {}
    

    您可能希望附加样式类而不是替换

    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
  •  5
  •   Per Henrik Lausten    7 年前

    大多数(全部?)标准XPages控件使用 WAI-ARIA standard for validation 因此自动获得 aria-invalid

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

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