我正在使用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组件被禁用,当我提交表单时,“required value”验证不起作用。当我单击selectBooleancheckbox组件时,inputText将被启用,并且当我提交表单时,“required value”验证也会起作用。但是,当我禁用inputText时,验证继续工作,并显示“需要的值”消息,我无法提交表单。当我点击复选框时,似乎服务器端的JSF UI组件树没有正确更新,虽然在视觉上我可以看到每次单击复选框时都会禁用inputText组件。
我有什么想法可以解决这个问题?
答案 0 :(得分:3)
如果验证不比此示例代码中显示的更复杂,则使用
编码打开和关闭它<p:inputText id="inputText" disabled="#{bean.selectedObjectsMap[childItem]}" required="#{!bean.selectedObjectsMap[childItem]}" requiredMessage="value required" />
这意味着您切换必需的属性与使用与禁用属性相同的bean值,只需添加!
答案 1 :(得分: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>