【问题标题】:Angular 7 form field control error isn't getting removed [duplicate]Angular 7表单字段控制错误没有被删除[重复]
【发布时间】:2019-06-14 06:32:43
【问题描述】:

我正在尝试创建一个带有密码确认和电子邮件确认字段的注册页面,用户必须在其中重复密码和电子邮件。这是FormGroup的设置:

ngOnInit() {
this.basicInfo = this.formBuilder.group({
  userName: ['', [Validators.required, Validators.minLength(5)]],
  firstName: ['', Validators.required],
  lastName: ['',Validators.required],

  emails: this.formBuilder.group({
    email: ['', [Validators.required, Validators.email]],
    emailConfirm: ['', [Validators.required, Validators.email]],
  }, {validators: SignUpComponent.checkEmailMatch}),

  passwords: this.formBuilder.group({
    password: ['', [Validators.required]],
    passwordConfirm: ['', Validators.required]
  }, {validators: SignUpComponent.checkPasswordMatch})
});

密码字段的验证器如下(电子邮件相同):

static checkPasswordMatch(group: FormGroup) {
  let password = group.get('password');
  let passwordConfirm = group.get('passwordConfirm');
  if (password == null || passwordConfirm == null) return null; // prevent errors
  let match = password.value === passwordConfirm.value;
  if (!match) {
    passwordConfirm.setErrors({passwordMatchError: true});
    return {passwordMatchError: true};
  } else {
    return {passwordMatchError: null};
  }
}

预期结果

验证器应在 passwordpasswordConfirmed 被编辑时更新,如果它们的值不相同,则将相应的错误添加到 passwordConfirmed 控件。

实际发生的情况

只有在编辑 passwordConfirmed 时才会删除错误(在编辑任何一个时添加错误都有效)

尝试的解决方案

我尝试修改验证器中的 if 语句以从 passwordConfirm 中删除错误:

if (!match) {
  passwordConfirm.setErrors({passwordMatchError: true});
  return {passwordMatchError: true};
} else {
  passwordConfirm.setErrors({passwordMatchError: null}); <-- this line
  return {passwordMatchError: null};
}

这不会消除错误,而只是将其设置为 null。该控件仍被标记为无效,并且此日志向控制台指示的错误仍然存​​在:

是否有任何其他方法可以手动从表单控件中删除错误,或者是否有其他方法可以解决此问题?

(Angular 和 Angular 表单版本 7.2.0)

【问题讨论】:

  • 您需要返回null(视为有效)而不是{passwordMatchError: null};
  • 好点,但这只会消除父组而不是子控件上的错误,因为验证器位于组级别而不是单个控件上。

标签: angular typescript angular2-forms


【解决方案1】:

您无需手动设置setErrors 的错误。使用自定义验证器,您只需返回

return { myErrorName: true };

当它无效时,简单地说

return null;

何时有效。

所以修改你的验证器:

checkPasswordMatch(group: FormGroup) {
  let password = group.get('password');
  let passwordConfirm = group.get('passwordConfirm');
  if (!password && !passwordConfirm) return null;
  let match = password.value === passwordConfirm.value;
  return match ? null : { passwordMatchError: true};
}

DEMO

【讨论】:

  • 我正在使用角度材质 ui,希望错误显示在实际表单字段而不是父组上。
  • 这是有原因的吗,现在您在表单组而不是字段上设置自定义验证器,那么为什么要在组上这样做呢? :P
  • ... 但当然,问题是如果您要在表单控件上设置自定义验证器,则在编辑 password 字段时它不会触发。但我的问题是为什么它不能在表单组上。当然,如果您出于某种原因确实需要它,您可以为此做一些解决方法:)
  • 问题在于,从 ui 的角度来看,如果表单组有错误,它不会按照应有的方式在表单字段下显示错误。如果控件本身有错误,那么它看起来很好。
  • 这里是区别imgur.com/a/JxJY8HJ(我想要最上面的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2020-09-29
相关资源
最近更新 更多