首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当只有一个条件为真时,两个mat错误都会显示。

当只有一个条件为真时,两个mat错误都会显示。
EN

Stack Overflow用户
提问于 2019-07-03 10:34:01
回答 2查看 4K关注 0票数 2

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

我正在尝试使用mat错误来定制验证器。当电子邮件和确认密码的真实值为hasError(‘)时,它们都是红色的。

我认为我的MyErrorStateMatcher类逻辑是错误的。请帮帮我!我已经尽我所能了。提前谢谢你!

图像

就像你在图像中看到的。当confirmPassword抛出错误时,电子邮件字段也是红色的。

我的ErrorStateMatcher:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:(关注电子邮件和confimPassword)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 = "test@test.com";

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

错误发生在输入电子邮件和输入confirmPassword,两者都有[errorStateMatcher]="matcher"

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-04 09:34:07

创建customErrorMatcher

如果我们想在<mat-form-field>中显示一个错误,当input有效的时,我们使用customErrorMatcher。

这是一个类似于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
  }
}

正常情况下,我们有我们的组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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中添加一个构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
  }
}

然后,我们的组件变成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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>
票数 3
EN

Stack Overflow用户

发布于 2019-07-03 12:03:02

email address字段显示一个错误,因为错误状态匹配器检查父--即表单--这是错误的,因为密码字段不匹配。您需要对电子邮件字段和密码字段使用不同的错误状态匹配器,因为条件不同--如果密码字段不匹配,则电子邮件不需要出错。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56876119

复制
相关文章
删除,重命名文件
重命名文件----rename #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //修改文件名 void REname(char *arr) { int ret=rename("你好世界.txt", arr); if (ret == 0) { printf("修改成功"); } else { printf("修改失败"); } } void test01() { char buf[] = "你好,世界.txt"; REname(b
大忽悠爱学习
2021/03/02
1.7K0
删除,重命名文件
java删除文件,重命名文件
在做项目时,遇到需要对文件做一些删除重命名等操作。基于java语言,保存代码段如下。
全栈程序员站长
2022/08/12
1.8K0
翻译:Perl代码审计:Perl脚本中存在的问题与存在的安全风险
程序设计语言通常不构成安全风险,风险是由程序员带来的。几乎每种语言都有某些缺陷,这些缺陷在某种程度上可能有助于创建不安全的软件,但软件的整体安全性仍然在很大程度上取决于开发者的安全意识。Perl也有安全“陷阱”,然而大多数Perl程序员并不了解这些陷阱。
王驭停
2021/08/27
2.7K0
shell脚本添加用户删除用户删除文件的脚本实现
#/bin/bash # DEBUG=0 ADD=0 DEL=0 RM=0 while [ $# -gt 0 ] do case $1 in -v|-verbose) DEBUG=1 shift ;; -h|--help) #帮助文档 echo "`basename $0` --add LIST --del LIST -h|--help --rm LIST" exit 0 ;; --add
艳艳代码杂货店
2021/10/30
1.6K0
linux根据日期时间批量删除文件(删除N天前的文件)
find /www/wwwroot/shengsi-zhejiang/public/uploads/spot/Array/face -name "*" -mtime +3
炒香菇的书呆子
2023/10/01
2K0
Linux CentOS删除或重命名文件夹和文件的办法
Linux、CentOS操作系统下如何删除和重命名文件夹呢?办法如下: 一、Linux、CentOS下重命名文件和文件夹 mv:move 用移动文件命令就可以了,因为linux系统没有专门的重命名命令。 基本格式: 移动文件:mv 文件名 移动目的地文件名 重命名文件:mv 文件名 修改后的文件名 示例:mv oldfilename newfilename (oldfilename为旧文件名,newfilename为新文件名) 二、Linux、CentOS下删除文件和文件夹 通常情况下,删除文件用:rm 文件名。删除文件夹用:rmdir 文件夹名。 但是rmdir不能删除非空的文件夹,那如何删除非空文件夹呢:命令:rm -rf 非空文件夹名; -r 就是向下递归,不管有多少级目录,一并删除。 -f 就是直接强行删除,不作任何提示的意思。 1、删除文件夹命令 rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件、文件夹 2、删除文件命令 rm -f /var/log/httpd/access.log 将会强制删除/var/log/httpd/access.log这个文件 建议使用前做好备份,好像此命令是不会放到回收站的,删了就再也见不着下面的文件了。
红色扛把子
2019/03/16
4.5K0
脚本分享——对fasta文件中的序列进行排序和重命名
hello,hello! 小伙伴们大家下午好,我是小编豆豆,时光飞逝,不知不觉来南京工作已经一年了,从2018年参加工作至今,今年是我工作最快乐的一年,遇到一群志同道合的小伙伴,使我感觉太美好了。
用户1075469
2023/01/11
5.8K1
使用Perl的File::Path模块删除非空文件夹
不过那个只是针对单个的文件,使用unlink方法就可以了(未测试过只读文件删除的情况- -!),那如果要删除指定的一个文件夹,有三种方案:
meteoric
2018/11/15
1.3K0
perl文件句柄_perl文件句柄信号引用
大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。 Jetbrains全系列IDE稳定放心使用
全栈程序员站长
2022/11/02
1.9K0
linux下文件夹的创建、复制、剪切、重命名、清空和删除的命令
在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一、目录创建 在/home/wwwroot目录下新建一个sinozzz123的文件夹 mkdir /home/wwwroot/sinozzz123 二、目录复制 1.把/home/wwwroot/sinozzz里面的文件和文件夹等复制到home/wwwroot/sinozzz123目录下 cp -rf /home/wwwroot/sinozzz/* /home/w
菲宇
2022/12/02
3.2K0
Perl 文件操作
perl 语法的变态在下面的代码中体现更甚,一条没头没尾的正则,不知道的还以为是语法错误,实际它是可以正常执行的。
我与梦想有个约会
2023/10/21
1810
Java 删除文件以及文件夹删除不了的问题
今天在编写一个项目,流程是先创建一个临时文件夹存放生成的文件,再经过压缩导出,待导出成功后删除临时文件夹,但是怎么也删除不了,还以为是写的删除方法有问题,找来找去,试了很多方法也删除不了
全栈程序员站长
2022/06/26
2.3K0
Java 删除文件以及文件夹删除不了的问题
效率工具:强大的批量删除文件的脚本
最近打包服务器上的apk包又增多了,每次手动rm操作过于麻烦,于是花了几分钟写了一个可以对指定目录下根据最后修改时间和通配符匹配进行批量删除的脚本。将这个脚本加入crontab中之后,以后就再也不用担心多余的安装包占用磁盘空间了。
技术小黑屋
2018/09/05
1.9K0
【C 语言】文件操作 ( remove 函数删除文件 | rename 函数重命名文件 | 代码示例 )
rename 函数原型 : 将文件由 char *oldname 重命名为 char *newname ;
韩曙亮
2023/03/29
1.7K0
【C 语言】文件操作 ( remove 函数删除文件 | rename 函数重命名文件 | 代码示例 )
[124]linux常用命令(创建|重命名|删除)文件和文件夹
1.首先说一下touch 创建文件的命令,touch可以用于创建二进制文件,用法非常简单。用法:touch+文件名,touch与文件名之间一定要有空格。图中先用之前分享过的命令来查看一下/目录下面有多少文件以及文件的名字。
周小董
2022/04/12
3.7K0
[124]linux常用命令(创建|重命名|删除)文件和文件夹
iOS 创建文件夹,删除文件夹,对文件夹重命名的操作
+ (void)createFolder:(NSString )folderName { NSString imageDir = [NSString stringWithFormat:@"%@/Documents/%@", NSHomeDirectory(),folderName]; NSLog(@"HomeDir: %@",imageDir); BOOL isDir = NO; NSFileManager *fileManager = [NSFileManager defa
大师级码师
2021/10/29
2.8K0
linux重命名文件名_linux 文件重命名
https://blog.csdn.net/weixin_33724570/article/details/91909917
全栈程序员站长
2022/09/30
4.1K0
linux重命名文件名_linux 文件重命名
oracle脚本删除多实例aud文件
for i in $(ps -ef|grep ora_smon|grep -v grep|awk '{print $NF}'|cut -c 10-)
彻底
2023/07/07
5480
linux批量文件重命名命令_shell重命名文件指令
hello_10_2016-03-17.log hello_4_2016-03-17.log hello_8_2016-03-17.log
全栈程序员站长
2022/10/02
10.7K0
使用Python移动和重命名Excel文件
本文将向你展示如何在Python中移动和重命名Excel文件。此方法不仅适用于Excel文件,也适用于任何其他格式的文件,包括.docx、.txt、.pptx,等等。
fanjy
2021/11/17
3.1K0
使用Python移动和重命名Excel文件

相似问题

文件删除和重命名问题

20

Java删除和重命名文件问题

10

用perl重命名文件,文件被删除

40

删除和重命名有问题的文件

24

Perl脚本到ssh并重命名文件

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文