【问题标题】:Custom validator not working correctly in Angular reactive form自定义验证器在 Angular 反应形式中无法正常工作
【发布时间】:2019-11-17 11:49:39
【问题描述】:

Angular 新手并尝试添加一个自定义电子邮件验证器,该验证器将转到我的服务器并检查电子邮件地址是否已在使用中。

但似乎无法在表单上显示错误消息。 这是我在尝试访问服务器之前的测试方式。

仅供参考 - 调用了“emailMatchValidator()”,但我无法让它在表单上显示任何类型的错误消息!

也许我应该尝试 .touched 以外的其他东西!

ngOnInit() {
    this.createRegisterForm();
  }

createRegisterForm() {
  this.registerForm = this.fb.group({
    gender: ['male'],
    email: ['', [Validators.required, Validators.email]],
    username: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(10)]],
    knownAs: ['', Validators.required],
    dateOfBirth: [null, Validators.required],
    city: ['', Validators.required],
    country: ['', Validators.required],
    password: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(8)]],
    confirmPassword: ['', Validators.required]
  }, {
    validator: [this.passwordMatchValidator, this.emailMatchValidator]
  });
}

emailMatchValidator(g: FormGroup) {
  return g.get('email').value !== 'emailaddress@gmail.com' ? null : {
    emailExists: true
  };
}
<div class="form-group">
                      <input type="email" 
                        [ngClass]="{'is-invalid': registerForm.get('email').errors && registerForm.get('email').touched}
                          || registerForm.get('email').touched && registerForm.hasError('emailExists')"
                        class="form-control" 
                        formControlName="email" 
                        placeholder="Email">
                        <div class="invalid-feedback" *ngIf="registerForm.get('email').touched && registerForm.get('email').hasError('required')">
                          Email is required
                        </div>
                        <div class="invalid-feedback" *ngIf="registerForm.get('email').touched && registerForm.get('email').hasError('email')">
                          Invalid email address
                        </div>
                        <div class="invalid-feedback" *ngIf="registerForm.get('email').touched && registerForm.get('email').hasError('emailExists')">
                            Email address already in use
                          </div>
                    </div>

【问题讨论】:

    标签: angular typescript validation angular7 angular-reactive-forms


    【解决方案1】:

    做了一些改动:

    • 您已将验证应用于完整的表单,我仅将其更改为电子邮件字段email: ['', [Validators.required, Validators.email, this.emailMatchValidator]],

    • 将电子邮件字段值和电子邮件字段状态添加到屏幕以查看实际验证

    • 在电子邮件字段中输入任何内容并移动焦点以进行验证

    相关HTML

        <form class="form-group" [formGroup]='registerForm'>
            <input type="email" 
                            [ngClass]="{'is-invalid': registerForm.get('email').errors && registerForm.get('email').touched}
                              || registerForm.get('email').touched && registerForm.hasError('emailExists')"
                            class="form-control" 
                            formControlName="email" 
                            placeholder="Email">
                            <div class="invalid-feedback" *ngIf="registerForm.get('email').touched && registerForm.get('email').hasError('required')">
                              Email is required
                            </div>
                            <div class="invalid-feedback" *ngIf="registerForm.get('email').touched && registerForm.get('email').hasError('email')">
                              Invalid email address
                            </div>
                            <div class="invalid-feedback" *ngIf="registerForm.get('email').touched && registerForm.get('email').hasError('emailExists')">
                                Email address already in use
                              </div>
                        </form>
    
    <hr/>
                        <b>email value:</b> {{registerForm.controls.email.value}} <br/>
                        <b>email status:</b> {{registerForm.controls.email.status}}
    

    相关TS

    import { Component } from '@angular/core';
    import { FormBuilder, Validators, FormGroup, AbstractControl } from '@angular/forms'
    
    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent {
      name = 'Angular';
      constructor(private fb: FormBuilder) { }
      registerForm;
    
      ngOnInit() {
        this.createRegisterForm();
        console.log(this.registerForm);
      }
    
      createRegisterForm() {
        this.registerForm = this.fb.group({
          gender: ['male'],
          email: ['', [Validators.required, Validators.email, this.emailMatchValidator]],
          username: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(10)]],
          knownAs: ['', Validators.required],
          dateOfBirth: [null, Validators.required],
          city: ['', Validators.required],
          country: ['', Validators.required],
          password: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(8)]],
          confirmPassword: ['', Validators.required]
        }
          /*, {
              validator: [this.passwordMatchValidator, this.emailMatchValidator]
            }
            */
        );
      }
    
      passwordMatchValidator() {
        /* some implementation */
      }
    
      emailMatchValidator(control: AbstractControl) {
        if (control.value !== 'emailaddress@gmail.com') {
          return false;
        } else {
          return { emailExists: true };
        }
      }
    
    }
    

    工作stackblitz here

    【讨论】:

    • 感谢您的帮助!快速提问 - 由于这个项目不是我的,而且我还在学习,为什么开发人员在完整表单上使用“验证器:this.passwordMatchValidator”?是因为他试图验证多个控件(密码、确认密码)吗?
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2020-05-22
    相关资源
    最近更新 更多