有没有人知道在初始渲染之后是否可以通过PrimeFaces的p:menuitem更新JSF消息或消息元素?
例如,我有一个PrimeFaces p:menuitem我用来打开ap:dialog,那个p:对话框有ap:messages元素,我想要更新它的消息并显示p:对话框打开的那一刻 - 在p:menuitem的操作方法完成之后,我才知道是否有要显示的消息或该消息应该是什么。
不幸的是,将p:menuitem的update属性设置为p:对话框的id和p:messages元素本身的id不会导致p:messages元素显示其消息,即使我认为它应该是因为p:menuitem的action方法看起来正好向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);
}
答案 0 :(得分:3)
简短回答 :它的行为完全符合预期和实施。
更长的答案 :
仔细查看编辑过的问题后,我注意到对话框中的dynamic="true"
。如果您阅读了PrimeFaces文档(正如您已经发现的那样):
dynamic:使用ajax启用延迟加载内容。
因此,当您通过javascript显示对话框时,其 内容 会更新...由于此内容还包含p:messages
,因此也会更新。在您的情况下,使用在对话框更新的ajax调用中生成的消息更新 ...很可能没有...所以您添加的消息它在prepareDialogWithMessage()
menuItem
的{{1}}调用中丢失了。
由于你已经在对menuItem的调用中更新了对话框,dynamic='true'
完全是多余的,它会在工作中抛出一个扳手。
&lt; off-topic&gt;建议始终开始创建[mcve]。删除越来越多,直到某些部分的行为符合预期。在其中一个步骤中移除dynamic='true'
会产生这种情况,并且您已经了解了很多。同时,也尝试调试更多。通过查看浏览器开发人员工具中的请求和响应进行调查。您可能已经看到消息被添加到对话框中,然后对话框(内容)被完全覆盖。所有这些事情都很容易(对不起,很容易而不是很难),可以/会告诉你很多,并帮助更快地找到事情的原因。直接,或通过能够提出更具体的问题,通常更容易回答&lt; / off-topic&gt;