在离开页面之前关闭对话框


  • PrimeFaces:7.0
  • JSF:2.2.13
  • JBoss:7.1
  • Java:1.8
  • 铬:83.0.4103.116

我有一个简单的确认对话框可以转到另一个页面,应该以文本形式提供操作的原因。它可以归结为以下几行代码:

<p:dialog id="dlg" widgetVar="dlg" modal="true">
<h:form id="dlgForm">
<p:inputText id="reason" required="true" value="#{bean.reason}"/>
<p:message for="reason"/>
<p:commandButton id="proceed" value="Proceed" update="dlgForm" action="#{bean.action}"/>
<p:commandButton id="cancel" value="Cancel" resetValues="true" onclick="PF('dlg').hide()">
<p:ajax update="dlgForm" resetValues="true"/>
</p:commandButton>
</h:form>
</p:dialog>

还有豆子:

@ManagedBean(name = "bean")
@SessionScoped
class Bean {
public String processGrundFuerExportDlg() {
PrimeFaces.current().executeScript("PF('dlg').hide()");
return "other_page";
}
}

我的要求:

  • 对话框以空的"reason"-inputText打开
  • 如果按下"取消":对话框应关闭
  • 如果按下"继续":
    • 如果原因不为空:关闭对话框并导航到"other_page">
    • 如果返回为空:显示错误消息,不要关闭对话框

我的问题与此代码:行

PrimeFaces.current().executeScript("PF('dlg').hide()");

似乎是在当前页面离开后执行的,导致找不到"dlg"(JavaScript错误(。未正确关闭的对话框会产生一个令人讨厌的副作用:稍后返回到我的第一个页面后,对话框覆盖保持活动状态,并且无法使用鼠标激活inputText元素(TAB有效(。事件循环中的覆盖逻辑阻止将鼠标单击传递到页面上的组件。

我的问题:

  • 这个标准场景应该如何用JSF和PrimeFaces正确实现
  • 如果需要升级到其他版本,是否有一些解决方法可以在不升级的情况下删除过时的覆盖层

免责声明:我研究了StackOverflow上的许多相关问题,并尝试了所有提出的解决方案,但都没有成功。例如:当提交后发生验证错误时,保持p:对话框打开

如果您重定向到新页面而不是触发Ajax更新,就不会有这个问题。

您可以简单地将?faces-redirect=true添加到返回的字符串中,因此:

return "other_page?faces-redirect=true";

或者,如果使用的是faces-config,请将<redirect/>添加到<navigation-case>中。

然后,您可以从尝试关闭对话框的bean中删除该脚本。

另请参阅:

  • 如何在JSF中导航?如何使URL反映当前页面(而不是上一页(

如果按下"继续":如果原因不为空:关闭对话框并导航到"other_page"如果返回为空:显示错误消息,不要关闭对话框。

以上所有内容都是用必需的true on reason inputText处理的。如果原因是继续命令中的操作为空,按钮将不会启动。在导航到其他页面之前,您不需要关闭对话框。

相关内容

  • 没有找到相关文章

最新更新