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

Close dialog prior to navigate away from the page

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

<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";
    }
}

我的要求:

我对这段代码的问题:行

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

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

我的问题:

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

如果按下 'proceed': 如果原因不为空:关闭对话框并导航到 'other_page' 如果 return 为空:显示错误消息并且不关闭对话框。

以上所有这些都是根据 inputText 要求的 true 处理的。如果 reason 为空,则 commandButton 将不会启动。 在导航到其他页面之前,您不需要关闭对话框。

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

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

return "other_page?faces-redirect=true";

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

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

另请参阅:

  • How to navigate in JSF? How to make URL reflect current page (and not previous one)