Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过p:menuitem在初始呈现后更新JSF消息_Jsf_Jsf 2_Primefaces - Fatal编程技术网

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

通过p:menuitem在初始呈现后更新JSF消息,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,有人知道,在通过PrimeFaces的p:menuitem进行初始呈现之后,是否可以更新JSF消息或消息元素 例如,我有一个PrimeFaces p:menuitem,用于打开一个p:dialog,并且p:dialog有一个p:messages元素,我想在p:dialog打开时更新并显示该元素的消息-在p:menuitem的操作方法完成之前,我不知道是否有我想显示的消息,或者该消息应该是什么 不幸的是,将p:menuitem的update属性同时设置为p:dialog的id和p:messages

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

例如,我有一个PrimeFaces p:menuitem,用于打开一个p:dialog,并且p:dialog有一个p:messages元素,我想在p:dialog打开时更新并显示该元素的消息-在p:menuitem的操作方法完成之前,我不知道是否有我想显示的消息,或者该消息应该是什么

不幸的是,将p:menuitem的update属性同时设置为p:dialog的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" />
简短回答:它的行为完全符合预期和实施

更长的答案

仔细查看您编辑的问题后,我注意到对话框上的
dynamic=“true”
。如果您阅读PrimeFaces文档,它会声明(正如您已经发现的):

动态:支持使用ajax延迟加载内容

因此,当您通过javascript显示对话框时,其内容将更新。。。由于此内容还包括
p:messages
,因此也会进行更新。在您的例子中,使用对话框更新的ajax调用中生成的消息再次更新了。。。很可能没有。。。因此,在
menuItem
prepareDialogWithMessage()
调用中添加到其中的消息将丢失

由于您已经在对菜单项的调用中更新了对话框,
dynamic='true'
是完全多余的,它会给工作带来麻烦

建议始终开始创建[mcve]。拆卸次数越来越多,直到某些零件的性能达到预期。如果在其中一个步骤中删除
dynamic='true'
,就会产生这样的结果,而且您会知道更多。同时,也多尝试调试。通过查看browser developer工具中的请求和响应进行调查。您会看到消息被添加到对话框中,然后对话框(内容)被完全覆盖。所有这些事情都很简单(对不起,简单而不是“不难”),可以/将告诉你很多,并有助于更快地找到原因。无论是直接提问,还是能够提出更具体的问题,这些问题通常更容易回答:它的行为完全符合预期和实施

更长的答案

仔细查看您编辑的问题后,我注意到对话框上的
dynamic=“true”
。如果您阅读PrimeFaces文档,它会声明(正如您已经发现的):

动态:支持使用ajax延迟加载内容

因此,当您通过javascript显示对话框时,其内容将更新。。。由于此内容还包括
p:messages
,因此也会进行更新。在您的例子中,使用对话框更新的ajax调用中生成的消息再次更新了。。。很可能没有。。。因此,在
menuItem
prepareDialogWithMessage()
调用中添加到其中的消息将丢失

由于您已经在对菜单项的调用中更新了对话框,
dynamic='true'
是完全多余的,它会给工作带来麻烦


建议始终开始创建[mcve]。拆卸次数越来越多,直到某些零件的性能达到预期。如果在其中一个步骤中删除
dynamic='true'
,就会产生这样的结果,而且您会知道更多。同时,也多尝试调试。通过查看browser developer工具中的请求和响应进行调查。您会看到消息被添加到对话框中,然后对话框(内容)被完全覆盖。所有这些事情都很简单(对不起,简单而不是“不难”),可以/将告诉你很多,并有助于更快地找到原因。无论是直接提问,还是能够提出更具体、更容易回答的问题

谢谢@Kukeltje的想法,然而,我相信p:message和p:messages组件都没有javascript API,因为1)我在PrimeFaces文档中找不到任何关于它的提及,2)两个组件都没有widgetVar属性,因此我不相信有任何ID可以传递给PF(widgetVar)对于访问任何未记录的javascript,Apiketje@Kukeltje表示感谢,但是我们的应用程序的设计/架构使得我们避免(尽可能多地)编写任何原始HTML或javascript。在这种情况下,p:menuitem上的update属性会导致p:messages元素在p:menuitem的操作完成后被更新,这似乎是预期/记录的行为。因此,我试图了解我可能误解了预期的/文件化的行为,然后再考虑其他建议,就像你建议的那样。我很感激你花了这么多时间看着这个“库克特杰”,并且跟随了你的领导,删除了我对任何冒犯的评论。另外,在我更好地理解了这个问题之后,我更新了这个问题——我认为我最初的措辞“在表单提交之前更新JSF消息”是不正确的,因为我在应用程序中发现了另一个页面,它使用页面的preRenderView方法在表单提交之前更新JSF消息。请阅读对话框上的动态属性。这有什么区别吗?删除/更改与idea@Kukeltje有关的值,但是我相信p:message和p:messages组件都没有javascript API,因为1)我找不到任何
<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>
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);
}