Проверка формы Angular6

Я выполняю проверки формы с использованием документации 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>

адреса электронной почты должны быть подтверждены через атрибут email или через атрибут pattern. Видя, что вы используете формы на основе шаблонов, вам нужно будет создать директиву в теге form для проверки соответствия пароля. Для длины будет достаточно атрибута minlength.

user4676340 23.10.2018 14:44

Спасибо, сэр. Ваше предложение действительно поможет мне найти решение

jmarkatti 23.10.2018 20:44
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
2
160
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вот как я смог решить эту проблему, если это может кому-то помочь.

    <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>
Ответ принят как подходящий

Я попытался реализовать заявленные вами требования, ниже ссылка:

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

Я использовал встроенные валидаторы для минимальной длины и для проверки электронной почты.

И настраиваемый валидатор для пароля и подтверждения совпадения пароля.

Эти ссылки полезны:

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

https://material.angular.io/

Я надеюсь, что это помогает

Теперь ваше решение и мое решение работают с той же целью, но я выбираю ваш ответ для получения дополнительных знаний об угловых материалах. Спасибо

jmarkatti 24.10.2018 16:34

Попробуйте использовать реактивные формы в angular, на мой взгляд, он более читабельный и гибкий. Можно начать с здесь. Ваша форма будет выглядеть так:

<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>

Затем создайте свою форму в файле .ts, используя FormBuilder следующим образом:

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});
   }

Для проверки длины, адреса электронной почты и прочего можно использовать встроенные валидаторы, но для сопоставления пароля вам следует написать еще код. Я написал это в отдельном файле 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;
  }
}

Пожалуйста, проверьте следующее.

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. import {ErrorStateMatcher } from '@angular/material';

    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;   }
    
    }
    

Другие вопросы по теме