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?