单击复选框时动态禁用验证器

时间:2013-07-09 04:48:39

标签: validation jsf primefaces disabled-control

我的jsf中有一个数字验证器和一个复选框。选中复选框后,数字验证器将检查验证。取消选中复选框后,验证将跳过它。

请参阅我的代码

<h:outputText value="#{trancheResources.label_enable}:" />
<p:selectBooleanCheckbox id="enableCheckBox" itemLabel="#{trancheResources.label_yes}" value="#{trancheBean.enableCheck}" disabled="#{trancheBean.readonly}">

</p:selectBooleanCheckbox>

<p:outputLabel for="acceptableMinVal" value="#{trancheResources.label_acceptableMinVal}:" />
<pe:inputNumber id="acceptableMinVal" value="#{trancheBean.trancheValidation.podMin}" disabled="#{trancheBean.readonly}" maxValue="999"
                required="#{trancheBean.requiredIfEnableCheck}" requiredMessage="#{trancheResources.label_acceptableMinVal} is required.">
    <f:validateDoubleRange disabled="#{trancheBean.cValidation}" minimum="1.00" />
</pe:inputNumber>

<p:outputLabel for="acceptableMaxVal" value="#{trancheResources.label_acceptableMaxVal}:" />
<pe:inputNumber id="acceptableMaxVal" value="#{trancheBean.trancheValidation.podMax}" disabled="#{trancheBean.readonly}" maxValue="999"
                required="#{trancheBean.requiredIfEnableCheck}" requiredMessage="#{trancheResources.label_acceptableMaxVal} is required.">
    <p:ajax event="keyup"  listener="#{trancheBean.acceptableMaxValOnkeyup}" ></p:ajax>
</pe:inputNumber>

<p:outputLabel for="exceptionMinVal" value="#{trancheResources.label_exceptionMinVal}:" />
<pe:inputNumber id="exceptionMinVal" value="#{trancheBean.trancheValidation.podExceptionMin}" disabled="#{trancheBean.readonly}" maxValue="999"/>

<p:outputLabel for="exceptionMaxVal" value="#{trancheResources.label_exceptionMaxVal}:" />
<pe:inputNumber id="exceptionMaxVal" value="#{trancheBean.trancheValidation.podExceptionMax}" disabled="#{trancheBean.readonly}" maxValue="999"/>

请指导我一个解决方案。我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

我将为您提供此示例答案,您可以使用它将其应用到您的答案中。这种方法基于Pankaj Kathiriya的评论,因为这似乎是你想要做的。

在下面的示例代码中,您有两个<h:inputText>(用您的<pe:inputNumber>替换此组件)。每次选中/取消选中rendered时,他们的<p:selectBooleanCheckBox>属性值都会更改。当rendered评估为true时,将显示带验证的<h:inputText>,未验证的那个消失(反之亦然)。

每次检查/取消选中<selectBooleanCheckBox>时,ValueChangeEvent都会触发immediate。您还需要确保将true设置为renderResponse,以便可以先处理它(之前的一个阶段)。然后在听众中调用<h:inputText>以跳过剩余的生命周期。如果不进行验证,将对<h:selectBooleanCheckBox>进行验证,并且当切换发生时您将看到验证错误消息。最后,对于onchange,您希望在选择/取消选择发生时提交表单。这可以通过将submit()属性设置为onchange = "submit()"(例如public class SampleBean { private boolean renderValidatedForm; private String firstInput; private String secondInput; //Constructor ommitted //Setters and getters ommitted public void toggleRender(ValueChangeEvent e) { boolean valueCheck = (Boolean) e.getNewValue(); renderValidatedForm = valueCheck; FacesContext.getCurrentInstance().renderResponse(); } } )来使用javascript来完成。尝试运行代码,这样一切都有意义。

请再次注意,这只是一个示例,可以帮助您找到解决方案。

<h:form>
    <h:panelGrid>
        <h:panelGroup>
            <h:outputLabel for="enableCheckBox" value="Check to view form with validation"/>
            <p:selectBooleanCheckbox id="enableCheckBox" value="#{sampleBean.renderValidatedForm}" 
                                     onchange="submit()" 
                                     valueChangeListener="#{sampleBean.toggleRender}"
                                     immediate="true"/>
        </h:panelGroup>
        <h:panelGroup>
            <h:outputLabel for="withValidation" value="Form with validation" 
                           rendered="#{sampleBean.renderValidatedForm}"/>
            <h:inputText id="withValidation" value="#{sampleBean.firstInput}" 
                         required="true" rendered="#{sampleBean.renderValidatedForm}"/>
            <h:message for="withValidation"/>
        </h:panelGroup>
        <h:panelGroup>
            <h:outputLabel for="noValidation" value="Form without validation" 
                           rendered="#{!sampleBean.renderValidatedForm}"/>
            <h:inputText id="noValidation" value="#{sampleBean.secondInput}" 
                         rendered="#{!sampleBean.renderValidatedForm}"/>
        </h:panelGroup>
    </h:panelGrid>
    <h:commandButton value="Submit"/>
</h:form>

xhtml

{{1}}