Ошибка ввода угловой и html5 даты
У меня есть простая форма с одним контролем даты. Когда я набираю недопустимую дату, например 30 февраля 2018 года, элемент управления находится в недопустимом состоянии, и мой стиль CSS включается, и элемент управления отображается с красной рамкой. Но моя проблема в том, когда пользователь нажимает сохранить, this.appFormGroup.invalid
возвращается false
и операция сохранения выполняется. Как мне остановить операцию сохранения? (Я хочу сообщить пользователю, что дата недействительна.)
Следующий код демонстрирует проблему, с которой я сталкиваюсь. Благодарю.
файл app.component.ts
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'app';
appFormGroup: FormGroup;
constructor(public formBuilder: FormBuilder) {
}
ngOnInit() {
this.appFormGroup = this.formBuilder.group({
sampleDate: ['']
});
}
onButtonClick() {
if (this.appFormGroup.invalid) {
alert("Invalid");
}
else {
alert("Valid");
}
}
}
файл app.component.html
<form [formGroup]="appFormGroup">
<div >
<div>
<label for="sampleDate">Sample Date</label>
<input type="date" [id]="sampleDate" formControlName="sampleDate" min="" class="form-control-dynamic">
</div>
<button (click)="onButtonClick()">Save</button>
</div>
</form>
файл app.components.css
input[type="date"]:invalid {
border-width : 2px;
border-color: red;
}
2 ответа
В вашем контроле формы вы не использовали никакой проверки. Сначала удалите min attr из HTML, создайте пользовательский валидатор даты и используйте этот валидатор при создании элемента управления. Чтобы избежать ошибки в пустом поле, не используйте required и возвращайте true из пользовательского валидатора, если значение есть и оно недопустимо.
sampleDate: ['', [DateValidator]] //don't use required
function DateValidator(): ValidatorFn {
return (control: AbstractControl): { [key: string]: boolean } | null => {
if (control.value !== undefined && YOUR_CUSTOM_VALIDATION_LOGIC) {
return { 'dateInvalid': true }
};
return null;
}
}
Дело в том, что ваша угловая форма не проверяет дату, поэтому она не является недействительной.
Вам нужно будет добавить валидатор в вашу форму, например
sampleDate: ['', [Validators.required, customDateValidator]
Вам, вероятно, понадобится создать свой собственный валидатор дат, смотрите здесь.
Затем, если ваш пользовательский валидатор возвращает, что дата недействительна, свойство формы invalid
будет установлен в true.