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