Primefaces rowEditor只是活动行验证

时间:2012-07-02 13:59:08

标签: jsf jsf-2 primefaces myfaces

在我的应用程序中,我有一些带有dataTables的对话框,用户可以编辑值,所以我使用的是primefaces rowEditor ...有时我在dataTable中需要字段,你可以在这个屏幕中看到:

dataTable with required fields

在此屏幕中,用户不需要填写所有行,因此,如果我将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

3 个答案:

答案 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"/>