即使JSF在流程验证阶段失败,也有办法更新组件

时间:2012-02-27 17:50:43

标签: jsf jsf-2 primefaces

我的输入文字有required=true属性,如下所示

<h:panelGrid columns=2>
   <h:panelGroup id="ccm">
      <p:inputText id="txtCCMNumber" value="#{setupView.selectedCCM}"
                 required="true" requiredMessage="Required">
          <p:ajax event="blur" listener="#{setupView.handleLooseFocusCCMTextbox()}"
              update=":setupForm:ccm :setupForm:ccmMsg"/>
      </p:inputText>
      <h:outputText value="Duplicated" id="ccmExisted"
                 styleClass="ui-message-error ui-widget ui-corner-all"
                 rendered="#{setupView.ccmNameExisted}"/>
      <h:graphicImage id="ccmNotExist" url="resources/images/check-icon.png"
                    rendered="#{setupView.ccmNameUnique}"
                    width="18"/>
   </h:panelGroup>
   <p:message for="txtCCMNumber" id="ccmMsg" display="text"/>
</h:panelGrid>

所以我的要求是,如果值为空,那么它将显示Required,因为required=true,它应该在流程验证阶段失败。如果值是唯一的,则显示check图像,如果重复,则显示Duplicated文本。我遇到的问题是,在我输入内容和标签之后(假设我输入了一些独特的内容),它显示check图像,然后我删除文本,然后再次标记,现在是{{1文本出现,但Required图片也是如此。我的理论是,在check阶段,由于值为空而失败,因此在更新组件阶段,它不会调用将设置布尔值Process validation的方法handleLooseFocusCCMTextbox()。到ccmNameUnique。有没有办法来解决这个问题?

注意:handleLooseFocusCCMTextbox()只需打开和关闭布尔值即可显示false图片或check文字。

回答即可。创建Validator类,取出required = true

Duplicated

1 个答案:

答案 0 :(得分:2)

您希望使用验证器而不是动作侦听器。

<p:inputText id="txtCCMNumber" value="#{setupView.selectedCCM}"
    required="true" requiredMessage="Required"
    validator="#{setupView.validateDuplicateCCM}">
    <p:ajax event="blur" update="ccm ccmMsg" />
</p:inputText>

public void validateDuplicateCCM(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if (value == null || value.toString().isEmpty()) {
        return; // Let required="true" handle.
    }

    // ...

    if (duplicate) {
        ((UIInput) component).setValid(false);
        ccmNameExisted = true;
        // I'd rather throw ValidatorException instead of above two lines here so that it ends up in <p:message>
    } else {
        ccmNameUnique = true;
    }
}