Angular6表单验证

时间:2018-10-23 12:42:53

标签: angular

我正在使用angular6文档进行表单验证,现在我确保所有表单验证都已填写,但现在

这是我的问题:

1。)如何验证密码和确认密码输入值不少于6个字符并且密码字段和确认密码字段必须匹配

2。)如何确保输入的电子邮件地址有效

  <form #r="ngForm" name="theForm" (submit)="reg(r)">
    <div class="form-group">
      <label>Username</label>
      <input type="text"
            class="form-control"
            name="username"
            [(ngModel)]="register.username"
            #registerUsername="ngModel"
            required
            pattern="^[a-zA-Z]+$">
      <span class="help-block danger" *ngIf="registerUsername.errors?.required && registerUsername.touched">
        The username is required
      </span>
      <span class="help-block danger" *ngIf="registerUsername.errors?.pattern && registerUsername.touched">
        The username can only contain the letters a-z or A-Z
      </span>
    </div>





    <div class="form-group">
      <label>Password</label>
      <input type="password"
            class="form-control"
            name="password"
            required
            [(ngModel)]="register.password"
            #registerPassword="ngModel">
      <span class="help-block danger" *ngIf="registerPassword.errors?.required && registerPassword.touched">
        password is required
      </span>
    </div>



 <div class="form-group">
      <label>Confirm Password</label>
      <input type="password"
            class="form-control"
            name="password"
            required
            [(ngModel)]="register.password"
            #registerPassword="ngModel">
      <span class="help-block danger" *ngIf="registerPassword.errors?.required && registerPassword.touched">
        Re-enter password is required
      </span>
    </div>





   <div class="form-group">
      <label>Email</label>
      <input type="email"
            class="form-control"
            name="email"
            required
            [(ngModel)]="register.email"
            #registerEmail="ngModel">
      <span class="help-block danger" *ngIf="registerEmail.errors?.required && registerEmail.touched">
        Email is required
      </span>
    </div>

4 个答案:

答案 0 :(得分:0)

这是我能够解决的方法,以防它可能对某人有所帮助。

    <div class="form-group">
      <label>Password</label>
      <input type="password"
            class="form-control"
            name="password"
            required  minlength="6"
            [(ngModel)]="register.password"
            #registerPassword="ngModel">
      <span class="help-block danger" *ngIf="registerPassword.errors?.required && registerPassword.touched">
        The password is required
      </span>

 <span *ngIf="registerPassword.errors?.minlength  && registerPassword.touched">
        Password must be at least 6 characters or longer.
      </span>

    </div>



  <div class="form-group">
      <label>Confirm Password</label>
      <input type="password"
            class="form-control"
            name="repassword"
            required  minlength="6"  pattern={{register.password}}
            [(ngModel)]="register.repassword"
            #registerRePassword="ngModel">
      <span class="help-block danger" *ngIf="registerRePassword.errors?.required && registerRePassword.touched">
        Confirm password is required
      </span>

 <span *ngIf="registerRePassword.errors?.minlength  && registerRePassword.touched">
        Password must be at least 6 characters or longer.
      </span>

  <span *ngIf="registerRePassword.errors?.pattern  && registerRePassword.touched">
        Passwords must match.
</span>

    </div>



   <div class="form-group">
      <label>Email</label>
      <input type="email"
            class="form-control"
            name="email"
            required  pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$"
            [(ngModel)]="register.email"
            #registerEmail="ngModel" email>
      <span class="help-block danger" *ngIf="registerEmail.errors?.required && registerEmail.touched">
        Email is required
      </span>


<span *ngIf="registerEmail.errors?.pattern  && registerEmail.touched">
       Valid Email is required
      </span>

    </div>

答案 1 :(得分:0)

我试图实现您所说的要求,下面是链接:

https://stackblitz.com/edit/angular-formvalidation-wins999-z1sxcw

我已经使用内置的验证器来最小化长度并验证电子邮件

以及用于密码和确认密码匹配的自定义验证器。

这些链接非常有用:

https://angular.io/guide/forms-overview

https://material.angular.io/

我希望对您有帮助

答案 2 :(得分:0)

尝试以斜角使用反应形式,在我看来,它更具可读性和灵活性。您可以从here开始。您的表单将如下所示:

<div [formGroup]="myForm" #form>
      <label>Username</label>
      <input formControlName="username" type="text">
      <label>Password</label>
      <input formControlName="password" type="password">
      <label>Confirm Password</label>
      <input formControlName="confirmPassword" type="password">
      <label>Email</label>
      <input formControlName="email" type="text">
      <button (click)="submit()" [disabled]="form.invalid">Submit</button>
    </div>

而不是像这样使用FormBuilder在.ts文件中构建表单:

myForm: FormGroup;
constructor(private builder: FormBuilder) {
  this.myForm = builder.group( {
    username: [null, Validators.required],
    password: [null, [Validators.required, Validators.minLength(6)]],
    confirmPassword: [null, Validators.required],
    email: [null, [Validators.required, Validators.email]]
    }, {validator: PasswordValidator.matchPassword});
   }

要验证长度,电子邮件和更多内容,您可以使用built-in validators,但是对于密码匹配,您应该编写一些代码。我将其写在单独的文件PasswordValidator.ts中。看起来像:

export class PasswordValidator {
  static matchPassword(control: AbstractControl) {
    const password = control.get('password').value;
    const confirmPassword = control.get('confirmPassword').value;
    if (password !== confirmPassword) {
      control.get('confirmPassword').setErrors({matchPasswords: true});
    }
    return null;
  }
}

答案 3 :(得分:0)

请检查以下内容。

HTML。   

          <mat-form-field class="full-width-input">
              <input matInput type="password" formControlName="newpassword" placeholder="Enter new password"
                [type]="hide1 ? 'password' : 'text'" required minlength="4" maxlength="25"
                text="test" #newpassword>
              <mat-icon matSuffix class="pointer-style" (click)="hide1 = !hide1" >
                {{hide1 ? 'visibility_off' : 'visibility'}}</mat-icon>
                <mat-error *ngIf="form.controls['newpassword'].hasError('required')">
                   New Password is <strong>required</strong>
                  </mat-error>
              <mat-error *ngIf="form.controls['newpassword'].hasError('minlength')">
                Your password must be at least <strong>4 characters. </strong>
            </mat-error>
            </mat-form-field>


            <mat-form-field class="full-width-input">

                <input matInput type="password" placeholder="Confirm password" formControlName="conformpassword" [errorStateMatcher]="matcher"
                  [type]="hide2 ? 'password' : 'text'" text="test" #conformpassword>
                <mat-icon matSuffix class="pointer-style" (click)="hide2 = !hide2">
                  {{hide2 ? 'visibility_off' : 'visibility'}}</mat-icon>
                  <mat-error *ngIf="form.hasError('notSame')">
                      Passwords does not match
                  </mat-error>

              </mat-form-field>
          <div class="full-width-input">

          </div>
          <button  style="margin-left: 75px;" mat-raised-button [disabled]="!form.valid" color="primary">SUBMIT</button>
        </form>

在组件中:

  1.   

    从'@ angular / material'导入{ErrorStateMatcher};

    export class MyErrorStateMatcher implements ErrorStateMatcher {
    
      isErrorState(control: FormControl | null, form: FormGroupDirective
    | NgForm | null): boolean {
    
        const invalidCtrl = !!(control && control.invalid && control.parent.dirty);
        const invalidParent = !!(control && control.parent && control.parent.invalid && control.parent.dirty);
    
        return (invalidCtrl || invalidParent);   } } @Component({   selector: 'app-changepassword',   templateUrl:
    './changepassword.component.html',   styleUrls:
    ['./changepassword.component.scss'] }) export class
    ChangepasswordComponent implements OnInit {   form: FormGroup;  
    error = '';   formSubmitAttempt: boolean;   oldPassword:
    FormControl;   newpassword: FormControl;   conformpassword:
    FormControl;   hide: boolean;   hide1: boolean;   hide2: boolean;  
    matcher = new MyErrorStateMatcher();
    
    constructor(private fb: FormBuilder) {
    
    
            this.form = this.fb.group({
              oldPassword:  ['', Validators.compose([Validators.required, Validators.minLength(4),
    Validators.maxLength(25)])],
              newpassword:  ['', Validators.compose([Validators.required, Validators.minLength(4),
    Validators.maxLength(25)])],
              conformpassword:  ['']
    
            }, {validator: this.checkPasswords });
            dialogRef.disableClose = true;
        }
    
        checkPasswords(group: FormGroup) { // here we have the 'passwords' group
        let pass = group.controls.newpassword.value;
        let confirmPass = group.controls.conformpassword.value;
    
    
        return pass === confirmPass ? null : { notSame: true }   }
    
    
      ngOnInit() {
        this.hide = true;
        this.hide1 = true;
        this.hide2 = true;   }
    
    }