p:验证失败时未隐藏对话框

时间:2017-05-10 11:03:29

标签: jsf primefaces jsf-2

我在关闭PrimeFaces对话框时遇到问题。输入字段'username'是必需的:

<p:outputLabel for="username" value="Username: "/>
<p:inputText id="username"
    value="#{employeeController.employee.username}" required="true"/>

如果字段为空,我使用以下代码来阻止对话框关闭:

<p:commandButton value="Save" action="{employeeController.doSaveEmployee()}"
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('employeeAddDialog').hide()"
    update=":employeeForm"/>

但无论是否填写“用户名”,只要我点击“保存”,对话框仍会关闭。当关闭后再次打开对话框显示错误消息时,我知道输入验证有效。

编辑:

<p:dialog header="Create Employee" id="employeeAddDialog" widgetVar="employeeAddDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
  <p:outputPanel id="employeeDataCreate">
    <h:panelGrid columns="2">
      <p:outputLabel for="username" value="Username: " />
      <p:inputText id="username" value="#{employeeController.employee.username}" required="true" />

      <p:outputLabel for="password" value="Password: " />
      <p:password id="password" value="#{employeeController.employee.password}" />
    </h:panelGrid>
    <h:panelGrid columns="3">
      <p:commandButton value="Save" action="#{employeeController.doSaveEmployee()}" oncomplete="if (args &amp;&amp; !args.validationFailed) PF('employeeAddDialog').hide()" update=":employeeForm" />
      <p:commandButton value="Abort" oncomplete="PF('employeeAddDialog').hide()" />
    </h:panelGrid>
  </p:outputPanel>
</p:dialog>

这是一些更多的代码。还有什么可能是造成这个问题的原因? employeeForm只是一个dataTable,它列出员工的相应属性。

EDIT2:

EmployeeController中的此代码会产生想要的行为,但前提是我从“保存”按钮中移除update=":employeeForm"

public void doSaveEmployee() {
    employee = employeeService.saveEmployee(employee);
    employee = null;
    initNewEmployee();
    initList();
    RequestContext context = RequestContext.getCurrentInstance();
    context.execute("PF('employeeAddDialog').hide();");
}

最终编辑:

我的对话框正在关闭,因为我更新了整个表单。将update=":employeeForm"更改为update=":employeeForm:employeeTable"会使事情按预期运行。

2 个答案:

答案 0 :(得分:1)

我建议在成功保存动作后在employeeController.doSaveEmployee()中进行近距离操作

RequestContext context = RequestContext.getCurrentInstance();
context.execute("PF('myDialogVar').hide();");

答案 1 :(得分:1)

不确定为什么使用oncomplete =“args&amp; amp; amp; amp; ...”。我从来没有用过它并且效果很好。

oncomplete="if (args &amp;&amp; !args.validationFailed) PF('employeeAddDialog').hide()"

我用它像:

 oncomplete="if (!args.validationFailed) PF('employeeAddDialog').hide()"

这是一个问题错误吗?