p:messages 显示但几乎立即消失
p:messages displays but disapear almost instantly
我有一个关于 p:message 标签的奇怪问题。在页面 a 上有一个数据表,其中包含我的数据库中的数据,我可以在 p: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>
感谢您的回答。对不起,我总是忘记它。下次我会尽量不忘记它。
我终于设法解决了我的问题。
- 我给第一个加了个id
<p:message>
- 我在提交中添加了此 ID 的更新
<p:commandButton>
你的具体问题归结为:
<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" />
也就是说,为什么在同一个 <h:form>
中仍然有 <p:dialog>
和 <p:dataTable>
?看来您没有采纳或理解我对您上一个问题的回答中的建议 。其中,我建议将 <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>
另请参阅:
- How to use <h:form> in JSF page? Single form? Multiple forms? Nested forms?
我有一个关于 p:message 标签的奇怪问题。在页面 a 上有一个数据表,其中包含我的数据库中的数据,我可以在 p: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>
感谢您的回答。对不起,我总是忘记它。下次我会尽量不忘记它。 我终于设法解决了我的问题。
- 我给第一个加了个id
<p:message>
- 我在提交中添加了此 ID 的更新
<p:commandButton>
你的具体问题归结为:
<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" />
也就是说,为什么在同一个 <h:form>
中仍然有 <p:dialog>
和 <p:dataTable>
?看来您没有采纳或理解我对您上一个问题的回答中的建议 <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>
另请参阅:
- How to use <h:form> in JSF page? Single form? Multiple forms? Nested forms?