Как обрабатывать проверки ошибок формы в угловых
Привет я новичок в угловых и в моей форме у меня есть три поля Имя, адрес электронной почты
и радио раздел мое требование
-> когда я выбираю имя радио-кнопка Поле ввода имени обязательно для заполнения
-> когда я выбираю радио-кнопку электронной почты, поле ввода электронной почты обязательно для заполнения
Я старался изо всех сил, но безрезультатно. Как я могу выполнить это требование, может кто-нибудь помочь мне, пожалуйста
.html:
<form class="example-form" [formGroup]="emailForm">
<!-- Name -->
<mat-form-field class="example-full-width">
<input matInput placeholder="Name" formControlName="name"
[errorStateMatcher]="matcher" [(ngModel)]="name" [required]="radioModel=='1'">
<mat-hint>Errors appear instantly!</mat-hint>
<mat-error *ngIf="emailForm.get('name').hasError('required')">
Name is <strong>required</strong>
</mat-error>
</mat-form-field>
<!-- Email -->
<mat-form-field class="example-full-width">
<input matInput placeholder="Email" formControlName="email"
[errorStateMatcher]="matcher" [(ngModel)]="email" [required]="radioModel=='2'">
<mat-hint>Errors appear instantly!</mat-hint>
<mat-error *ngIf="emailForm.get('email').hasError && !emailForm.get('email').hasError('required')">
Please enter a valid email address
</mat-error>
<mat-error *ngIf="emailForm.get('email').hasError('required')">
Email is <strong>required</strong>
</mat-error>
</mat-form-field>
<!-- Radio Button -->
<div class="radion-button">
<mat-radio-group formControlName="radioGroup" [(ngModel)]="radioModel">
<mat-radio-button value="1">Name</mat-radio-button>
<mat-radio-button value="2">Email</mat-radio-button>
<mat-error *ngIf="emailForm.get('radioGroup').hasError('required') && emailForm.get('radioGroup').touched">
Selection is <strong>required</strong>
</mat-error>
</mat-radio-group>
</div>
</form>
.ts:
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroupDirective, NgForm, FormGroup, FormBuilder, Validators } from '@angular/forms';
import { ErrorStateMatcher } from '@angular/material/core';
/** Error when invalid control is dirty, touched, or submitted. */
export class MyErrorStateMatcher implements ErrorStateMatcher {
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
const isSubmitted = form && form.submitted;
return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted));
}
}
/** @title Input with a custom ErrorStateMatcher */
@Component({
selector: 'input-error-state-matcher-example',
templateUrl: './input-error-state-matcher-example.html',
styleUrls: ['./input-error-state-matcher-example.css'],
})
export class InputErrorStateMatcherExample {
emailForm: FormGroup;
constructor(private formBuilder: FormBuilder) { }
ngOnInit() {
//Form Group
this.emailForm = new FormGroup({
email:new FormControl('', [Validators.required,Validators.email]),
name:new FormControl('', [Validators.required]),
radioGroup:new FormControl('',[Validators.required])
});
}
matcher = new MyErrorStateMatcher();
}
мой код ----> https://stackblitz.com/edit/angular-2m1vdq-yfxnps
3 ответа
Если вы удалите Validators.required
из файла TS, должно работать
this.emailForm = new FormGroup({
email:new FormControl('', [Validators.email]),
name:new FormControl('', []),
radioGroup:new FormControl('',[Validators.required])
});
Вы можете динамически добавлять проверки в FormControls, используя setValidators, основываясь на условии.
this.emailForm.get('radioGroup').valueChanges.subscribe(value=>{
if(value === '1'){
this.emailForm.get('name').setValidators(Validators.required);
this.emailForm.get('name').updateValueAndValidity();
alert('name is required');
}else if(value === '2'){
this.emailForm.get('email').setValidators(Validators.required);
this.emailForm.get('name').updateValueAndValidity();
alert('email is required');
}
});
Вы можете использовать пакет NPM . Его легко использовать и настраивать как для реактивных, так и для шаблонных форм.
Фрагмент кода:
HTML
<form [formGroup]="demoForm">
<div>
<label for="name">Name</label>
<input type="text" formControlName="name" name="name" placeholder="Name validator">
<tn-form-error [control]="demoForm.controls.name" [field]="'Name'"></tn-form-error>
</div>
</form>
Составная часть
<p>
this.demoForm = new FormGroup({
name: new FormControl(''[Validators.required])
});
Поиграйте со stackblitz