1

我正在使用 jsf 2.1 + primefaces 3.4.1。我遇到了阻止验证禁用组件的问题。

我所拥有的大约是这样的:

<h:form id="form">
    <p:dataTable id="parentDataTable" value=#{bean.list} var="parentItem"..>
        <p:column>
          ..
          <p:dataTable id="childDataTable" value=#{bean.map[parentItem]}" var="childItem">
                <p:column>
                    <f:facet name="header">
                        some inputText
                    </f:facet>
                    <p:inputText id="inputText"
                        disabled=#{bean.selectedObjectsMap[childItem]} required="true" requiredMessage="value required" />
                    <p:message for=":form:parentDataTable:childDataTable:inputText" />
                </p:column>
                <p:column>
                    <f:facet name="header">
                        Select
                    </f:facet>
                    <p:selectBooleanCheckbox id="checkBox" value="#{bean.selectedObjectsMap[childItem]}">
                        <p:ajax update=":form:parentDataTable:childDataTable:inputText" />
                    </p:selectBooleanCheckbox>
                </p:column>
            </p:dataTable>
        </p:column>
    </p:dataTable>
</h:form>

这个想法是,默认情况下 inputText 组件被禁用,并且当我提交表单时“必填值”验证不起作用。当我单击 selectBooleancheckbox 组件时, inputText 被启用,并且当我提交表单时“必需值”验证也有效。但是,当我禁用 inputText 时,验证继续工作,并且出现“需要值”消息,我无法提交表单。当我单击复选框时,似乎服务器端的 JSF UI 组件树没有正确更新,尽管在视觉上我可以看到每次单击复选框时 inputText 组件都会被禁用。

有什么想法可以解决这个问题吗?

4

2 回答 2

3

如果您的验证并不比此示例代码中显示的更复杂,您可以使用代码打开和关闭它

<p:inputText id="inputText" disabled="#{bean.selectedObjectsMap[childItem]}" required="#{!bean.selectedObjectsMap[childItem]}" requiredMessage="value required" />

这意味着您使用与禁用属性相同的 bean 值切换所需属性,只需添加一个 !

于 2012-12-11T11:40:23.140 回答
0

如果您想通过 commandButton 上的验证器,那么您可以实现

<f:validator validatorId="EmailValidator"  disabled="#{param['disableValidation']}" />

在表单上动态启用和禁用电子邮件验证器。

<p:commandButton
                                    icon="ui-icon-remove" id="removeBtn"
                                    title="#{commonLbl.cmdRemoveCon}"
                                    disabled="#{pc_searchProspectBean.searchProspectVO.prospectVO.removeContactFlg}"
                                    styleClass="btn btn-sm btn-primary"
                                    action="#{pc_searchProspectBean.doRemoveContact(prospectTbl.indexId)}"
                                    update=":frm1:pnlProspectContact" onclick="modalDialog.show()"
                                    oncomplete="modalDialog.hide()">
                                    <f:param name="disableValidation" value="true" />
                                </p:commandButton>
于 2016-08-01T12:23:10.407 回答