【问题标题】:Validator does not show in growl or messages验证器未显示在咆哮或消息中
【发布时间】:2021-07-15 10:17:38
【问题描述】:

我创建了一个自定义验证器,它与通常的 p:message 一起使用。但我会将此验证器用于多个相同类型(整数)的字段,并以咆哮或消息的形式显示消息。但我注意到这条消息几乎立即隐藏在咆哮和消息中。

这是我的咆哮(在模板中):

<p:growl id="msgs" autoUpdate="true" showDetail="true" />

这是消息(在特定页面中):

<p:messages id="messages" autoUpdate="true" closable="true" showDetail="true" />

怎么了?通常,使用addMessage,模板咆哮有效。我还尝试在验证器的validate() 方法中执行addMessage,但现在两条消息消失了!

我也尝试在咆哮中添加sticky="true",但没有。

我很想将所有 p:message 添加到页面顶部并使用 JS 删除其他人...

我正在使用 Primefaces 3.4.1 和 Mojarra 2.1.7

【问题讨论】:

  • 试试keepAlive="true"
  • @JasperdeVries:在咆哮声还是在验证器中?
  • @JasperdeVries: 如果它在咆哮,keepAlive="true" 不起作用:(
  • 这就是为什么我不在咆哮中使用自动更新。此外,我更喜欢在咆哮中验证失败时显示一般消息以及每个失败字段的详细信息。请参阅stackoverflow.com/questions/42247737/… 您还可以通过 Ajax 更新来自该侦听器的咆哮。
  • @BalusC:从“全局”咆哮中删除 autoUpdate="true" 是可行的,但是如果我将相同的验证器放在多个输入上,则错误消息会显示更多次,即使我把redisplay="false"

标签: jsf primefaces


【解决方案1】:

BalusC的帮助下,我解决了这个问题。

首先,按照 BalusC 的建议,我从“全局”咆哮和“本地”消息中删除了 autoUpdate="true"。这将对应用程序的其余部分产生影响,但这不是问题:D

问题在于,如果我将验证器添加到两个或多个输入,则会多次显示相同的消息。所以,在提交按钮上,我添加了

oncomplete="Util.removeErrorDuplicates('#messages');"

Util.removeDuplicates()的代码在哪里:

Util.removeErrorDuplicates = function (selector) {
    setTimeout(function() { 
        Util.removeDuplicates(selector + " li"); 
    }, 10);
}

Util.removeDuplicates()的代码是:

Util.removeDuplicates = function (selector) {
    "use strict";
    
    var $elements = $(selector);
    var $element;
    var element;
    var html;
    
    var htmlsDone = new Set();
    var elementsNum = $elements.length;
    
    for (var i=0; i<elementsNum; i++) {
        element = $elements[i];
        html = element.outerHTML;
    
        if (htmlsDone.has(html)) {
            $element = $elements.eq(i);
            $element.remove();
        }
        else {
            htmlsDone.add(html);
        }
    }
}

如果setTimeoutUtil.removeErrorDuplicates() 中的毫秒数太低且未删除重复项,请随意更改:)

【讨论】:

  • 你读过stackoverflow.com/questions/42247737/…吗?对于这个问题,似乎是一个更简单、更全局的解决方案。请注意,您可以在咆哮时使用globalOnly
  • @JasperdeVries:是的,我读到了stackoverflow.com/questions/42247737/…。不同之处在于我不希望任何输入的自定义消息(为任何输入创建类的过度杀伤力)。此外,我尝试输入globalOnly="true",但它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多