当只有一个条件为真时,两个 mat-error 都会显示

2023-12-05

当只出现一个错误时,两个 mat-error 都会显示。

我正在尝试使用 mat-error 制作自定义验证器。当电子邮件和确认密码的输入都具有 hasError('') 的真值时,它们都呈红色。

我认为我的 MyErrorStateMatcher 类逻辑不知何故是错误的。请帮忙!我已经尝试了一切我能做的。先感谢您!

Image

正如您在图片中看到的。当confirmPassword抛出错误时,电子邮件字段也是红色的。


我的错误状态匹配器:

export class MyErrorStateMatcher implements ErrorStateMatcher {
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
    const invalidCtrl = !!(control && control.invalid && (control.dirty || control.touched));
    const invalidParent = !!(control && (control.parent.hasError('notTheSame') || control.parent.hasError('emailUsed')));

    return ((invalidCtrl || invalidParent));
  }
}

HTML:(重点关注电子邮件和确认密码)

<form [formGroup]="signupForm" (ngSubmit)="signup(signupForm)">
        <mat-form-field style="width: 100%;">
          <input matInput formControlName="email" placeholder="Email address" type="email" [errorStateMatcher]="matcher" required>
          <mat-error *ngIf="signupForm.controls.email.hasError('required')">Email required!</mat-error>
          <mat-error *ngIf="signupForm.controls.email.hasError('email')">Email invalid!</mat-error>
          <mat-error *ngIf="signupForm.hasError('emailUsed')">This email already exists!</mat-error>
        </mat-form-field>
        <mat-form-field style="width: 100%;">
          <input matInput formControlName="username" placeholder="User name" (blur)="signupForm.value.username != null ? isValidUsername(signupForm.value.username) : ''" required />
          <mat-error>Please enter your new username!</mat-error>
          <mat-error *ngIf="usernameInvalid">Username already exists!</mat-error>
        </mat-form-field>
        <mat-form-field style="width: 100%;">
          <input matInput formControlName="password" placeholder="New password" [type]="show ? 'text' : 'password'" required />
          <mat-icon matSuffix (click)="show = !show" style="cursor: pointer;">{{show ? 'visibility' : 'visibility_off'}}</mat-icon>
          <mat-error>Please enter your password!</mat-error>
        </mat-form-field>
        <mat-form-field style="width: 100%;">
          <input matInput formControlName="confirmPassword" placeholder="Confirm password" type="password" [errorStateMatcher]="matcher" required>
          <mat-error *ngIf="signupForm.controls.confirmPassword.hasError('required')">Please confirm your password!</mat-error>
          <mat-error *ngIf="signupForm.hasError('notTheSame') && signupForm.value.confirmPassword != ''">Password is not the same!</mat-error>
        </mat-form-field>
        <br>
      <button mat-raised-button class="sessionBtn" color="primary" [disabled]="signupForm.invalid">Submit!</button>
</form>

TS:

signupForm = new FormGroup({
    firstName: new FormControl(),
    lastName: new FormControl(),
    email: new FormControl('', [
      Validators.required,
      Validators.email
    ]),
    username: new FormControl(),
    password: new FormControl('', [
      Validators.required
    ]),
    confirmPassword: new FormControl('', [
      Validators.required
    ])
  }, { validators: [this.checkPassword, this.checkExistingEmail] });
  matcher = new MyErrorStateMatcher();

/////////Custom validator////////

  checkPassword(signupForm: FormGroup) {
    let password = signupForm.value.password;
    let confirmPassword = signupForm.value.confirmPassword;

    return password === confirmPassword ? null : { notTheSame: true };
  }

  checkExistingEmail(signupForm: FormGroup) {
    let inputEmail = signupForm.value.email;
    let dbEmail = "[email protected]";

    return inputEmail !== dbEmail ? null: { emailUsed: true };
  }

输入电子邮件和输入确认密码时发生错误,两者都有[errorStateMatcher]="matcher"


创建自定义ErrorMatcher

好吧,如果我们想显示一个错误<mat-form-field>当。。。的时候input is valid,我们使用customErrorMatcher。

这是一个像

class CrossFieldErrorMatcher implements ErrorStateMatcher {
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
    //when we want to show the error
    return true 
    //when we want not show the error
    return false
  }
}

通常我们的组件中有

  errorMatcher=new CrossFieldErrorMatcher()
  //and the .html
  <mat-form-field>
    <input matInput formControlName='verifyPassword' 
        [errorStateMatcher]="errorMatcher">
    <mat-error *ngIf="....">
      Passwords do not match!
    </mat-error>
  </mat-form-field>

好吧,我们稍微改变一下,在我们的 customErrorMatcher 中添加一个构造函数

class CrossFieldErrorMatcher implements ErrorStateMatcher {
  constructor(private name:string){}  //<--add a constructor
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
    //when we want to show the error, but we can use "name"
    return true 
    //when we want not show the error
    return false
  }
}

然后,我们的组件就变成了

  errorMatcher(name:string)
  {
    return new CrossFieldErrorMatcher(name);
  }

  //and the .html
  <mat-form-field>
    <input matInput formControlName='verifyPassword' 
        [errorStateMatcher]="errorMatcher('password')">
    <mat-error *ngIf="....">
      Passwords do not match!
    </mat-error>
  </mat-form-field>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当只有一个条件为真时,两个 mat-error 都会显示 的相关文章

随机推荐

  • Lambda 表达式返回错误

    这是我的代码 SomeFunction m gt ViewData AllEmployees Where c gt c LeaderID m UserID 它返回此错误 并非所有代码路径都返回 lambda 表达式类型的值System Fu
  • SDK19 启动时相机2 库崩溃的 Android 应用程序

    我在我的应用程序中使用 androidx camera camera2 库 该库适用于 SDK 21 及更高版本 但我希望允许用户在没有camera2支持的情况下启动SDK 19的应用程序 我在代码中检查了 SDK 版本 但应用程序在启动时
  • Laravel 5:找不到“HTML”类

    我刚刚开始使用 Laravel 我处于控制器方法中 我说 return View make scrape data 然后在 scrape blade php 中我有 extends layouts master 最后 在 layouts m
  • 未收到 Firebase Cloud Messaging 的 Android 后台通知

    我搜索了很多有关应用程序在后台或关闭时的通知的信息 顺便说一句 我正在使用 Firebase 云消息传递 这对我不起作用 我使用了 Android 设置 当应用程序位于前台或手机未锁定时 会收到通知 安装后 令牌会正确打印并订阅该主题 当我
  • 如何缩放 HTML5 画布而不使其变得模糊?

    我使用以下标记创建了画布
  • 如何使 UIPickerView 组件环绕?

    我想在 UIPickerView 组件中显示一组连续数字 但让它像 Clock gt Timer 应用程序的秒组件一样环绕 我可以启用的唯一行为类似于计时器应用程序的小时组件 您只能在一个方向上滚动 将行数设置为较大的数字并使其以较高的值开
  • 在字符串中插入空格(Matlab)

    我有一根绳子 S ABACBADECAEF 如何在该字符串中的每 2 个字符之间插入一个空格 预期输出应该是 Out S AB AC BA DE CA EF 有几种方法可以做到这一点 所有这些方法都假设您的字符串长度是even 如果字符数量
  • Bash:简单变量赋值时“找不到命令”

    这是我的脚本的一个简单版本 显示失败 bin bash something false something else blahblah name file ext echo something echo something else ech
  • JPanel 的绘制背景

    我怎样才能告诉paint方法只在JPanel上绘制背景而不是在整个JFrame上 我的 JFrame 大小比 JPanel 大 当我尝试为 JPanel 绘制网格背景时 网格似乎被绘制在整个 JFrame 而不仅仅是 JPanel 上 这里
  • android - 按类型过滤 assetManager.list 文件

    我想从资产中的特定目录获取 html 文件的列表 有代码 gt gt private List
  • 语句“USE @dbname”不起作用,为什么?怎么做?

    我有这个 t sql 片段 DECLARE db name varchar 255 SET db name MY DATABASE assuming there is database called my database USE db n
  • 如何从本身触发 hx-get 调用的 SSE 事件中获取 htmx get 的 url?

    我正在将 django 与 django channels 和 htmx 一起使用 在某些情况下 我的 django 视图将向订阅相关频道的用户发送 SSE 事件 例如通知 其中一些事件 取决于事件名称 需要触发模式弹出窗口 例如电子商务订
  • HTML5 Canvas - 使用鼠标按锚点旋转

    我正在html5的canvas元素中进行开发 我有以下代码 它是可拖动且可调整大小的图像 我怎样才能将它变成可通过锚点旋转 我怎样才能通过锚点提供实时旋转 我看到了其他代码示例 但不知道如何实现它 采样器工作 http jsfiddle n
  • [0,1,2,3].map 工作正常,array.map 给出奇怪的结果

    我正在使用成帧器运动 并且我正在尝试实现交错 以便每个下一个孩子都有一些不错的延迟 有一行关键代码 当我替换时 0 1 2 3 map with recipes map突然间 所有的孩子都被视为一大块 他们不再摇摇欲坠 看看这个demo你一
  • 如何启用/禁用内核 kaslr、smep 和 smap

    我想知道如何从 Linux 内核启用或禁用这 3 个功能 kaslr smep smap 我读过我必须在内核命令行中添加一些内容才能启用此功能 我查看了 proc cmdline 我没有看到任何有关 smep 的信息 但是 当我询问 pro
  • 统计catch块中发生的异常数量

    我正在尝试收集发生异常的所有计数以及异常的名称ConcurrentHashMap这样我就应该知道这个异常发生了多少次 因此 在我的 catch 块中 我有一个映射 它将继续添加异常的名称和出现的总计数 下面是我的代码which I have
  • 如何强制 XDocument 以大写形式输出序言,同时保留缩进和格式?

    I want XDocument输出 XML 序言 例如 大写 这是我目前正在做的事情 但这似乎不起作用 XDocument doc new XDocument new XDeclaration 1 0 UTF 8 bla bla bla
  • 如何使用 MediaStore 在 Android Q 中保存图像?

    这是新 Android Q 的链接范围存储 根据这个 Android 开发者最佳实践博客 storing shared media files 这是我的情况 应该使用媒体商店 API 深入研究文档 我找不到相关的功能 这是我在 Kotlin
  • 尝试在 Azure Databricks 中安装 rJava 时遇到错误

    dyn load usr lib jvm java 8 openjdk amd64 jre lib amd64 server libjvm so 中的错误没有这样的文件或目录 在 Azure Databricks 中遇到此错误 很好有记录的
  • 当只有一个条件为真时,两个 mat-error 都会显示

    当只出现一个错误时 两个 mat error 都会显示 我正在尝试使用 mat error 制作自定义验证器 当电子邮件和确认密码的输入都具有 hasError 的真值时 它们都呈红色 我认为我的 MyErrorStateMatcher 类