【问题标题】:p:messages displays but disapear almost instantlyp:消息显示但几乎立即消失
【发布时间】:2019-05-27 15:12:54
【问题描述】:

我对 p:message 标签有一个奇怪的问题。在页面 a 上有一个 dataTable ,其中包含我的数据库中的数据,我可以在 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>

【问题讨论】:

  • 我很确定这是因为您的消息中有 auto update=“true”。如果你用 F12 观察网络流量,你会看到它
  • 正如 OP 在从他/她的代码中越来越多地创建 minimal reproducible example 时会发现的那样,并且在 emd 中注意到删除您提到的内容使其工作。再次,minimal reproducible example 到救援队

标签: jsf primefaces


【解决方案1】:

您的具体问题归结为:

<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 请求时自动更新组件。
  • &lt;p:commandButton&gt; 调用一个 ajax 请求,该请求添加一条消息并调用updateForm() 远程命令。该消息显示在该 ajax 请求上。
  • &lt;p:remoteCommand&gt; 调用另一个 ajax 请求。但是这个没有添加任何消息,因此该 ajax 请求上没有显示任何内容。实际上,前一个 ajax 请求中显示的消息被清除了。

您可以使用命令组件的ignoreAutoUpdate 属性来让它忽略任何autoUpdate-able 组件。所以你的解决方案是:

<p:remoteCommand name="updateForm" update="@form" ignoreAutoUpdate="true" />

也就是说,为什么您仍然在同一个&lt;h:form&gt; 中同时拥有&lt;p:dialog&gt;&lt;p:dataTable&gt;?您似乎没有接受或理解我对您之前的问题p:commandButton doesn't dislpay p:dialog 的回答中的建议。其中我建议将&lt;p:dialog&gt; 移到&lt;h:form&gt; 之外并给它自己的&lt;h:form&gt;。它使这些事情变得更容易管理。

您应该始终&lt;p:dialog&gt; 提供自己的&lt;h:form&gt;

<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>

另见:

【讨论】:

  • 感谢您的回答,我更了解它为什么不起作用。要回答您关于单一表格的问题,这是因为此代码比我提出的问题要旧。我没有忘记您对表单和对话框的建议;-)。
【解决方案2】:

感谢您的回答。对不起,我总是忘记它。下次我会尽量不要忘记它。 我终于设法解决了我的问题。

  • 我给第一个&lt;p:message&gt;添加了一个id
  • 我在提交&lt;p:commandButton&gt;中添加了这个id的更新

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多