验证失败时,保持<p:dialog>打开

Fab*_* B. 12 validation jsf primefaces jsf-2

我有一个CRUD页面,显示Primefaces数据表中查询(域对象列表)的数据.

<p:dataTable 
                id="negozi" 
                var="n" 
                value="#{nController.theListFromQuery}" 
                rowKey="#{n.id}"
                selection="#{nController.selected}" 
                selectionMode="single">

                <p:column headerText="Field1">
                    <h:outputText value="#{n.f1}" />
                </p:column>
                <p:column headerText="Field2">
                    <h:outputText value="#{n.f2}" />
                </p:column>
<p:column style="width:4%">
                    <p:commandButton 
                        actionListener="#{nController.prepareEdit(n)}"
                        update=":editDialogId" 
                        oncomplete="editDialog.show()" 
                        value="Edit" />
                </p:column>
...
Run Code Online (Sandbox Code Playgroud)

通过单击编辑按钮,将显示一个对话框:

    <p:dialog 
                header="Edit N" 
                widgetVar="editDialog" 
                id="editDialogId">

                    <h:form id="formDialog">

                        <h:panelGrid id="editDialogTable" columns="2" cellpadding="10" style="margin:0 auto;">

                            <p:outputLabel for="field1" value="F1:" />
                            <p:inputText id="field1" value="#{nController.selected.f1}" />
                            <p:outputLabel for="field2" value="F2:" />
                            <p:inputText id="field2" value="#{nController.selected.f2}" />
<p:commandButton 
                        value="Confirm" 
                        actionListener="#{nController.doEdit}" 
                        update=":form" 
                        oncomplete="editDialog.hide()"
                        rendered="#{nController.selected.id!=null}" />                  
...
Run Code Online (Sandbox Code Playgroud)

有用.现在我想让F1成为必填项目.

我将"required"属性添加到inputText字段,会发生什么?

当我尝试确认没有必填字段的表单时,实体不会被编辑(这是正确的),但对话框已关闭(这不对!)

当我重新打开对话框时,我可以在所需(和无效)字段上看到红色突出显示.

我想要的是在表单无效时阻止对话关闭.

我是否必须编写一些JS或者JSF会帮助我吗?

Bal*_*usC 35

PrimeFaces ajax响应将args对象放在具有validationFailed属性的范围内.你可以利用它.

oncomplete="if (args &amp;&amp; !args.validationFailed) PF('editDialog').hide()"
Run Code Online (Sandbox Code Playgroud)

(args在请求期间抛出异常时,必须预先检查才能导致JS错误)

您可以将其重构为可重用的JS函数,如下所示.

oncomplete="hideDialogOnSuccess(args, 'editDialog')"
Run Code Online (Sandbox Code Playgroud)
function hideDialogOnSuccess(args, dialogWidgetVar) {
    if (args && !args.validationFailed) {
        PF(dialogWidgetVar).hide();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

这篇文章现在已经有三年了,但我发现有帮助,所以我的发现可能对其他人有帮助.

至少在PF 5.x中,似乎BalusC提供的解决方案必须以两种方式进行修改.(1)在oncomplete事件处理器中为调用添加"args"参数,以及(2)使用PF primefaces原语来识别PF表中的窗口小部件.这是我正在使用的代码:

oncomplete="hideDialogOnSuccess(args, PF('editDialog'))"

function hideDialogOnSuccess(args, dialogWidgetVar) {
    if (args && !args.validationFailed) {
        dialogWidgetVar.hide();
    }
}
Run Code Online (Sandbox Code Playgroud)