通过 p:menuitem 初始呈现后更新 JSF 消息

Update JSF messages after initial rendering via p:menuitem

有谁知道是否可以在通过 PrimeFaces 进行初始呈现后更新 JSF 消息或消息元素 p:menuitem?

例如,我有一个 PrimeFaces p:menuitem 我正在使用它来打开一个 p:dialog,而那个 p:dialog 有一个 p:messages 元素,我想更新并显示 p:dialog 打开的那一刻 - 在 p:menuitem 的操作方法完成之前,我不知道是否有我想显示的消息或该消息应该是什么。

不幸的是,将 p:menuitem 的更新属性设置为 p:dialog 的 id 和 p:messages 元素本身的 id 不会导致 p:messages元素来显示它的消息,尽管我认为它应该因为 p:menuitem 的操作方法看起来它正在正确地向 p:messages 元素添加消息。

打开对话框的菜单项:

<p:menuitem value="Show Dialog with Message" action="#{myView.prepareDialogWithMessage()}" oncomplete="PF('dialogWidget').show()" update="dialogWithMessage message" />

带有消息的对话框:

<p:dialog id="dialogWithMessage" widgetVar="dialogWidget" resizable="false" dynamic="true" closable="false" showEffect="fade" hideEffect="fade">
    <p:messages id="message" for="message" showDetail="true" escape="false" autoUpdate="true"/>
    <div class="button-panel">
        <p:commandButton value="Yes" styleClass="ui-confirmdialog-yes" action="#{myView.submitAction()}" oncomplete="PF('dialogWidget').hide();"/>
        <p:commandButton value="No" styleClass="ui-confirmdialog-no" onclick="PF('dialogWidget').hide();"/>
    </div>
</p:dialog>

添加消息的Java代码:

public void prepareDialogWithMessage() {
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Summary of message we want to show when the dialog opens", "Details of the message we want to show when the dialog opens");
    FacesContext.getCurrentInstance().addMessage("message", message);
}

简答:它的行为完全符合预期和实施。

更长的答案:

仔细查看您编辑的问题后,我注意到对话框中的 dynamic="true"。如果您阅读 PrimeFaces 文档,它会指出(正如您已经发现的那样):

dynamic: Enables lazy loading of the content with ajax.

因此,当您通过 javascript 显示对话框时,其 内容 会更新...因为此内容还包括p:messages,也更新了。在您的情况下,再次更新了对话框更新的ajax调用中生成的消息...很可能none...所以您在 menuItemprepareDialogWithMessage() 调用中添加的消息丢失了。

由于您已经在对 menuItem 的调用中更新了对话框,因此 dynamic='true' 完全是多余的,它会在工作中引发麻烦。

<题外话>一个建议是始终开始创建 [mcve]。删除越来越多,直到某些部分的行为符合预期。在其中一个步骤中删除 dynamic='true' 会导致这种情况,并且您会知道更多。同时,也要多尝试调试。通过查看浏览器开发人员工具中的请求和响应进行调查。您会看到消息被添加到对话框中,然后对话框(内容)被完全覆盖。所有这些事情也很容易(抱歉,简单而不是“不难”),can/will 告诉你很多并有助于更快地找到事情的原因。要么直接,要么通过能够提出通常更容易回答的更具体的问题