我的输入文字有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
答案 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;
}
}