通过p:menuitem初始渲染后更新JSF消息

时间:2016-02-22 21:53:39

标签: jsf jsf-2 primefaces

有没有人知道在初始渲染之后是否可以通过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);
}

1 个答案:

答案 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;