在我的应用程序中,我有一些带有dataTables的对话框,用户可以编辑值,所以我使用的是primefaces rowEditor ...有时我在dataTable中需要字段,你可以在这个屏幕中看到:
在此屏幕中,用户不需要填写所有行,因此,如果我将required = true,所有字段(包括非活动字段)显示所需的验证消息。这样,如果用户点击OK按钮,他就无法关闭弹出窗口,因为有很多必需的字段验证错误。 我尝试以这种方式在必需属性中使用参数:
<f:facet name="input">
<h:selectOneMenu value="#{cfop.idTipoTributacao}" required="#{param['EDITAVEL']}"
style="width: 100px;">
<f:selectItems value="#{selectTipoTributacao.itens}"/>
</h:selectOneMenu>
</f:facet>
但遗憾的是,当用户点击p:rowEditor的保存按钮时,我没有找到传递此参数的方法。 有没有办法只有当它们处于编辑模式时才能使这些字段成为必需?我是使用MyFaces的用户界面2.2.1
答案 0 :(得分:2)
以下解决方法对我有用:
将此添加到您的JSF页面:
<script type="text/javascript">
function validateIfEditing()
{
var isEditing = false;
var checkmark= $(".ui-icon-check");
jQuery.each(checkmark, function() {
if ('' == this.style.display) {
isEditing = true;
}
});
if (isEditing) {
$("#form\\:notImmediate").click();
}
else {
$("#form\\:immediate").click();
}
}
</script>
然后修改“确定/保存”按钮:
<p:commandButton id="okButton" value="OK" onclick="validateIfEditing();"/>
<p:commandButton id="immediate" action="#{controller.save}" immediate="true" style="display:none"/>
<p:commandButton id="notImmediate" action="#{controller.save}" update="form" style="display:none"/>
实际上,这是一个javscript检查,当用户单击“确定/保存”以查看用户是否处于“编辑模式”时发生。编辑模式检查检查是否有任何复选标记图标;如果它可见,则用户必须处于编辑模式(如果您使用页面上其他位置的检查图标,则需要修改此解决方法)。如果用户处于编辑模式,则表单以immediate =“false”提交,因此将进行验证。如果用户未处于编辑模式,则表单将以immedidate =“true”提交,因此不会进行验证。对于“notImmediate”按钮单击,update属性设置为update =“form”,以便可以使用与任何验证错误关联的任何错误消息更新表单。
答案 1 :(得分:0)
我解决了创建自己的复合组件的问题......这样我就可以更好地控制验证的发生时间。
cellEditor的:
<c:interface>
<c:attribute name="id" required="false" targets="celula"/>
<c:attribute name="desabilitado" required="false" default="true"/>
<c:facet name="entrada" required="true"/>
<c:facet name="saida" required="true"/>
</c:interface>
<c:implementation>
<h:panelGroup id="celula" layout="block" styleClass="hrgi-celula">
<h:panelGroup layout="block" styleClass="hrgi-celula-entrada" style="display: none">
<c:renderFacet name="entrada" required="true"/>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="hrgi-celula-saida">
<c:renderFacet name="saida" required="true"/>
</h:panelGroup>
</h:panelGroup>
</c:implementation>
rowEditor:
<c:interface>
<c:attribute name="action" method-signature="void method(java.lang.Object)"/>
<c:attribute name="indice" required="true"/>
<c:attribute name="update" required="false" default=""/>
</c:interface>
<c:implementation>
<h:outputScript library="js" name="hrgiRowEditor.js" target="head"/>
<h:panelGroup layout="block">
<h:panelGroup id="painelBotaoEdicao" layout="block" style="display: inline">
<h:graphicImage library="img" name="pencil.png" onclick="ativarCamposEditaveis('#{cc.clientId}');"
style="cursor: pointer;"/>
</h:panelGroup>
<h:panelGroup id="painelBotoesSalvamento" layout="block" style="display: none">
<h:commandLink id="botaoSalvar" style="float: left;" onclick="definirIdRowEditor('#{cc.clientId}')">
<h:graphicImage library="img" name="check.png"/>
<f:param name="#{cc.attrs.indice}" value="true"/>
<p:ajax event="click" update="@form #{cc.attrs.update}" process="@form" listener="#{cc.attrs.action}"
oncomplete="desativarCamposEditaveisQuandoSucesso(xhr, status, args, this);"/>
</h:commandLink>
<h:graphicImage library="img" name="cancel.png" style="float: left; cursor: pointer;"
onclick="desativarCamposEditaveis('#{cc.clientId}');">
</h:graphicImage>
</h:panelGroup>
</h:panelGroup>
</c:implementation>
唯一的问题是我不能只更新表中的一行......也许我会创建另一个组件......
答案 2 :(得分:0)
或者
<p:commandButton id="okButton" value="OK" onclick="return $('.ui-icon-check:visible').length == 0"/>