【问题标题】:Close dialog prior to navigate away from the page在离开页面之前关闭对话框
【发布时间】:2020-10-27 11:42:21
【问题描述】:
  • 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";
    }
}

我的要求:

  • 对话框以空的“原因”-inputText 打开。
  • 如果按下“取消”:对话框应该关闭
  • 如果按下“继续”:
    • 如果原因不为空:关闭对话框并导航到“其他页面”
    • 如果返回为空:显示错误消息并且不要关闭对话框

我对这段代码的问题:行

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

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

我的问题:

  • 应如何使用 JSF 和 PrimeFaces 正确实施此标准场景?
  • 如果需要升级到其他版本,是否有一些解决方法可以在不升级的情况下删除陈旧的叠加层?

免责声明:我在 StackOverflow 上研究了许多相关问题,并尝试了所有提出的解决方案,但均未成功。比如这个:Keep p:dialog open when a validation error occurs after submit

【问题讨论】:

  • 听起来像xyproblem.info
  • @JasperdeVries 我不明白,我的问题 X 应该是什么。我只想让一个标准的“带有验证的对话框中的表单”工作。我想,像 JSF 和 PrimeFaces 这样成熟的技术,这应该不是问题。
  • 不关闭对话框并导航到新页面怎么样?
  • @JasperdeVries 我很乐意,但这正是我的问题(见问题)。对话框覆盖保持打开状态可防止将鼠标事件传递到小部件。阅读我的问题的相应段落。
  • “稍后返回我的第一页后”如何?通过使用浏览器的后退按钮?请提供minimal reproducible example

标签: jsf primefaces


【解决方案1】:

如果您重定向到新页面而不是触发 Ajax 更新,则不会遇到此问题。

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

return "other_page?faces-redirect=true";

或者,如果您使用的是faces-config,请将&lt;redirect/&gt; 添加到&lt;navigation-case&gt;

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

另见:

【讨论】:

  • &lt;redirect/&gt; 正是我一直在寻找的!谢谢! (return "other_page?faces-redirect=true"; 由于某种原因没有工作)
【解决方案2】:

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

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

【讨论】:

  • 如问题所述,如果我在离开页面前没有关闭对话框,我的鼠标点击将停止工作(从技术上讲,页面是相同的,但会使用新内容更新我的 JSF)
  • "关闭对话框并导航到 'other_page'" 我应该怎么做。您能否提供任何代码 sn-ps 或复制/粘贴我的代码并进行更改?谢谢。
  • 如果您的页面相同,则无需导航到其他页面。只需更新您需要的元素并关闭对话框。您还可以发布打开对话框的方式吗?
  • 我导航到不同的 JSF 页面,但从技术上讲,它是同一页面,但我不确定。如果它是全新的页面,我不知道打开的对话框的覆盖如何与新打开的其他页面混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多