jsf - p:消息显示但几乎立即消失
问题描述
我对 ap:message 标签有一个奇怪的问题。在页面 a 上有一个数据表,其中包含我的数据库中的数据,我可以在 ap:dialog 中进行编辑。一旦所有验证成功并且数据库中的更新完成后,我刷新数据表并添加面部消息信息以显示操作的成功。在前端,我更新了包含数据表和对话框的表单。我的问题是消息显示但几乎立即消失。就像消息标签随表单更新一样。我不明白。
我试图将消息标签移入和移出表单并没有改变任何东西。我试图调整 remoteCommand 以仅更新 dataTable 和对话框,但它没有用。
<p:messages autoUpdate="true" showDetail="true" severity="info,error" />
<h:form id="form">
<p:dataTable
style="width: 80%; margin-left: auto; margin-right: auto; text-align:center"
var="achievement" value="#{achievementBean.listAchievement}">
...
</p:dataTable>
<p:dialog header="#{i18n['achievement']}" widgetVar="dlg"
dynamic="true" closable="false" resizable="false" showEffect="fade"
hideEffect="fade">
<h:panelGroup id="achievementDetail">
<p:messages autoUpdate="true" severity="warn" />
...
<h:panelGrid columns="2" style="width: 100%; text-align:center">
<p:commandButton value="#{i18n['general.submit']}"
icon="fa fa-check"
actionListener="#{achievementBean.submitAchievement}"
oncomplete="if(!args.validationFailed){updateForm();}" />
<p:commandButton value="#{i18n['general.cancel']}"
icon="fa fa-close" action="#{achievementBean.submitCancel}"
oncomplete="PF('dlg').hide();" update="@form" process="@this" />
</h:panelGrid>
<p:remoteCommand name="updateForm" update="@form" />
</h:panelGroup>
</p:dialog>
</h:form>
解决方案
您的具体问题归结为:
<p:messages autoUpdate="true" />
<h:form>
<p:dataTable ...>
...
</p:dataTable>
...
<p:dialog>
...
<p:commandButton
action="#{achievementBean.submitAchievement}"
oncomplete="if(!args.validationFailed){updateForm();}" />
<p:remoteCommand name="updateForm" update="@form" />
</p:dialog>
</h:form>
- 将
autoUpdate="true"
在每个 ajax 请求上自动更新组件。 <p:commandButton>
调用一个 ajax 请求,该请求添加一条消息并调用远程updateForm()
命令。该消息显示在该 ajax 请求上。<p:remoteCommand>
调用另一个 ajax 请求。但是这个没有添加任何消息,因此该 ajax 请求上没有显示任何内容。实际上,前一个 ajax 请求中显示的消息被清除了。
您可以使用ignoreAutoUpdate
命令组件的属性,以便让它忽略任何autoUpdate
-able 组件。所以你的解决方案是:
<p:remoteCommand name="updateForm" update="@form" ignoreAutoUpdate="true" />
也就是说,为什么你仍然同时拥有 the<p:dialog>
和<p:dataTable>
the <h:form>
?您似乎没有接受或理解我对您之前的问题p:commandButton doesn't dislpay p:dialog的回答中的建议。在其中,我建议将其移到<p:dialog>
外部<h:form>
并赋予它自己的<h:form>
. 它使这些事情变得更容易管理。
你应该总是给<p:dialog>
它自己的<h:form>
。
<p:messages autoUpdate="true" />
<h:form>
<p:dataTable ...>
...
</p:dataTable>
<p:remoteCommand name="updateForm" update="@form" ignoreAutoUpdate="true" />
</h:form>
<p:dialog widgetVar="dlg">
<h:form>
...
<p:commandButton
action="#{achievementBean.submitAchievement}"
update="@form"
oncomplete="if(!args.validationFailed){PF('dlg').hide();updateForm();}" />
</h:form>
</p:dialog>
也可以看看:
推荐阅读
- php - 在 php-fpm docker 映像上更改为 pm = static
- vba - 嵌套 iif() 语句“太复杂”,无法在 MS Access 中运行
- sql-server - SQL Server:提高性能的文本搜索模式
- internationalization - 如何从相应的语言环境属性文件中加载所有属性
- c++ - std::set 与字符串键和潜在的效率损失
- python - 每 22 个字符向字符串添加一个输入,等到一个空格
- python - Discord.py - 使用命令更改前缀
- r - 如何在每行第一次出现匹配时停止匹配?
- tfs - 一旦设置了值,如何使 TFS 中的字段只读?
- c# - 当前线程调度程序创建在新 STA 线程上失败