Vaadin 14:将 TextField 中的错误消息标记为警告

Vaadin 14: Mark error message at TextField as warning

使用 Vaadin 14.1.23 TextFields 我想在视觉上区分红色错误消息(例如 "This value is too big.")和黄色警告(例如 "System will round your input to two decimals.")。并且可以选择蓝色信息消息。

因此我创建了一个带有验证器的 TextField,如本示例 (https://vaadin.com/components/vaadin-text-field/java-examples/validation ):当您在带有标签 "Min 2 characters" 的字段中键入“1”时,该字段会变为红色并显示错误: "Minimum 2 characters".

如何显示这样的(黄色)警告消息?

我试过的是这样的: 在我的验证器的应用方法中,我创建了一个带有 ErrorLevel WARNING 的验证结果,如下所示:

ValidationResult.create("System will round the decimals.", ErrorLevel.WARNING);

但是 Vaadin 仍然生成了一个 div with part="error-message":

<div part="error-message" aria-live="assertive" aria-hidden="false" id="my-field-error-44">System will round your input to two decimals.</div>

有一种方法可以达到这种效果。

首先您需要为 vaadin-text-field 创建主题。 在 frontend/styles 文件夹中创建 text-field-theme.css 文件,内容为:

:host([class="warn"]) [part="error-message"] {
    color: orange;
}

:host([invalid][class="warn"]) [part="input-field"] {
    background-color: rgba(255, 166, 0, 0.1);
    box-shadow: inset 0 0 0 1px orange;
}

用这段代码你说:当文本字段有 class "warn" 错误消息是橙色的,输入字段周围的框是橙色的,输入字段背景是透明的 (0.1) 橙色。

然后将其导入您的视图:

@CssImport(value = "./styles/text-field-theme.css", themeFor = "vaadin-text-field")

然后你用 2 个验证器绑定字段,一个有错误条件,第二个有警告条件:

TextField textField = new TextField();
binder.forField(textField)
      .withValidator(e -> {
         textField.removeClassName("warn");
         return e.length() > 3;
      }, "You must enter more than 3 characters", ErrorLevel.ERROR)
      .withValidator(e -> {
         textField.addClassName("warn");
         return e.length() > 5;
      }, "Maybe you should enter more than 5 characters", ErrorLevel.WARNING)
      .bind(Person::getName, Person::setName);

这将按预期与 binder.validate().isOk() 一起使用。 例如,当您输入 3 个或更少的字符时,您将看到红色错误消息,并且 binder.validate().isOk() 将 return false

当您输入 4 或 5 个字符时,您将看到黄色警告消息,并且 binder.validate().isOk() 将 return true.

对于蓝色信息消息过程是相同的。只需在 .css 文件中为 "info" class 复制代码并选择蓝色。然后为信息条件创建第三个验证器。不要忘记添加 "info" class,并在其他验证器条件(错误、警告)中将其删除。