在离开页面之前关闭对话框
Close dialog prior to navigate away from the page
- PrimeFaces:7.0
- JSF:2.2.13
- JBoss: 7.1
- Java: 1.8
- Chrome: 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。
- 如果按下 'cancel':对话框应该关闭
- 如果按下 'proceed':
- 如果原因不为空:关闭对话框并导航至 'other_page'
- 如果 return 为空:显示错误消息并且不关闭对话框
我对这段代码的问题:行
PrimeFaces.current().executeScript("PF('dlg').hide()");
似乎在当前页面离开后执行,导致 'dlg' 未找到(Java 脚本错误)。
未正确关闭的对话框会产生令人讨厌的副作用:稍后 return 进入我的第一页后,对话框覆盖保持活动状态并且无法使用鼠标激活 inputText 元素(TAB 有效)。事件循环中的覆盖逻辑阻止鼠标点击被传递到页面上的组件。
我的问题:
- 应如何使用 JSF 和 PrimeFaces 正确实施此标准场景?
- 如果需要升级到其他版本,是否有一些解决方法可以在不升级的情况下删除陈旧的覆盖?
免责声明:我在 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)
- PrimeFaces:7.0
- JSF:2.2.13
- JBoss: 7.1
- Java: 1.8
- Chrome: 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。
- 如果按下 'cancel':对话框应该关闭
- 如果按下 'proceed':
- 如果原因不为空:关闭对话框并导航至 'other_page'
- 如果 return 为空:显示错误消息并且不关闭对话框
我对这段代码的问题:行
PrimeFaces.current().executeScript("PF('dlg').hide()");
似乎在当前页面离开后执行,导致 'dlg' 未找到(Java 脚本错误)。 未正确关闭的对话框会产生令人讨厌的副作用:稍后 return 进入我的第一页后,对话框覆盖保持活动状态并且无法使用鼠标激活 inputText 元素(TAB 有效)。事件循环中的覆盖逻辑阻止鼠标点击被传递到页面上的组件。
我的问题:
- 应如何使用 JSF 和 PrimeFaces 正确实施此标准场景?
- 如果需要升级到其他版本,是否有一些解决方法可以在不升级的情况下删除陈旧的覆盖?
免责声明:我在 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)