- 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处理的。如果原因是继续命令中的操作为空,按钮将不会启动。在导航到其他页面之前,您不需要关闭对话框。