【问题标题】:How to specify whether the message should show up in p:growl or p:messages?如何指定消息是否应显示在 p:growl 或 p:messages 中?
【发布时间】:2012-05-24 11:04:22
【问题描述】:

在我的 Facelets 页面中,我有这个:

<p:growl id="msg1" life="1500"/>

还有一个

<p:messages id="msg2"/>

我只需要在&lt;p:messages&gt; 中显示以下消息。

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("veillez saisir les champs obligatoires (*)", null));

但它也出现在 &lt;p:growl&gt; 中。

如何指定消息的显示位置?

【问题讨论】:

    标签: jsf-2 primefaces messages


    【解决方案1】:

    摘自 primefaces 手册。第 282 页。

    目标消息

    有时您可能需要将一条或多条消息定位到特定消息 组件,例如假设您在同一页面上有咆哮和消息,您需要 在咆哮上显示一些消息,在消息上显示一些消息。用于属性关联消息 具有特定组件。

    <p:messages for="somekey" />
    <p:growl for="anotherkey" />
    

    豆子

    FacesContext context = FacesContext.getCurrentInstance();
    context.addMessage("somekey", facesMessage1);
    context.addMessage("somekey", facesMessage2);
    context.addMessage("anotherkey", facesMessage3);
    

    在上面的示例中,消息将显示第一条和第二条消息,而咆哮只会显示 第三条消息。

    【讨论】:

      【解决方案2】:

      由于p:messages 只是h:messages 的扩展,而p:growl 实际上与h:messages 相同,所以你不能。您可以做的是在向context 添加消息后不更新p:growl(可能您在某些“确认”commandButton 中这样做)然后它根本不会显示,但您不能指定只显示一些消息。更好的解决方案是不要将p:growlp:messages 混合使用,而只使用一个。

      您正在寻找的功能将在新的 Primefaces 3.3 Targetable messages

      中提供

      【讨论】:

      • 你显然不知道它是如何工作的。 p:messages 是一个显示所有生成消息的组件。如果您想为特定操作生成特定消息,请改用p:message。看看 Primefaces 展示 example,不要混淆 p:messagep:messages (s)。属性for 是关键。
      • 关键是什么?你能给我一个例子吗?因为我想添加这样的消息:FacesContext.getCurrentInstance().addMessage
      • 解决问题的关键。我已经给你举了一个例子。如果你需要使用FacesContext.getCurrentInstance().addMessage,那么你可以像这篇文章中描述的那样指定它Messages and FacesContext#addMessage
      • 顺便说一句,我回答了你的问题,所以如果你投票并接受就好了。
      • 谢谢,但我不知道如何投票我是这里的新手,我尝试投票但他们告诉我我没有足够的声誉
      【解决方案3】:

      由于您已经为 &lt;p:growl&gt;&lt;p:messages&gt; 分配了 2 个不同的 ID,我认为您可以尝试这样的操作:

      <div id="aDiv">
      
          ### Use the following button to update only <p:growl id="msg1"> ###
          <p:commandButton actionListener="#{mrBean.doSomething}" update="msg1" />
      
          ### Use the following button to update only <p:messages id="msg2"> ###
          <p:commandButton actionListener="#{mrBean.doSomethingElse}" update="msg2" />
      
      </div>
      

      关键是您应该只更新msg1msg2,而不是同时更新两者。在上面的示例中,如果您的按钮具有属性update="aDiv",您的消息将同时显示在&lt;p:growl&gt;&lt;p:messages&gt; 上。

      【讨论】:

      • 正如我所说,他可以选择要更新的内容以便仅重新渲染其中一个组件,但他最初的问题是他是否可以选择哪些消息将显示在哪个组件中。这是不可能的(将在 PF 3.3 中)。
      【解决方案4】:

      您可以使用 p:growl 的“严重性”属性来指定您希望仅在 Growl 中显示的消息类型。

      <p:growl id="messages" severity="info, warn, error, fatal" showDetail="true" life="5200" autoUpdate="true" />
      

      现在,如果您不想将 Growl 用于信息消息,则只需删除“信息”参数,然后您可以使用 p:message 或您自己选择的任何文本并相应地设置样式&lt;p:outputLabel value="A Validation error occured!" rendered="#{facesContext.validationFailed}" /&gt; 所以这样你就可以根据自己的选择使用 Growl 和消息了。

      【讨论】:

        【解决方案5】:

        这很简单,这里有一个例子 JSF + PrimeFaces 5.2

        <p:messages for ="Message1" showDetail="true" autoUpdate="true" closable="true" />
        
        <p:messages for ="Message2" showDetail="true" autoUpdate="true" closable="true" />
        
        FacesContext.getCurrentInstance().addMessage("Message1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", "Hello 1"));
        FacesContext.getCurrentInstance().addMessage("Message2", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", "Hello 2"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-27
          • 1970-01-01
          • 2011-06-09
          • 2013-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-04
          相关资源
          最近更新 更多