Angular 使用角度材质日期选择器进行日期验证

Angular 使用角度材质日期选择器进行日期验证,angular,datepicker,angular-material,Angular,Datepicker,Angular Material,我正在尝试使用物料日期选择器验证日期。具体来说,我试图验证的是,当用户在日期字段中键入“abc”时,我希望向他们显示“请输入有效日期”。我希望能够在击键时这样做,这样当他们输入'a'和'ab'以及'abc'时,他们会得到相同的错误 问题在于,在值能够解析为日期之前,日期选择器似乎没有设置模型值及其错误。我之所以知道这一点,是因为表单控件不是脏的,并且在键入“abc”时仍然有一个required错误 可以这样做吗?您可以在“日期更改”上附加一个处理程序,该处理程序在更改mat日期选择器的输入字段时

我正在尝试使用物料日期选择器验证日期。具体来说,我试图验证的是,当用户在日期字段中键入“abc”时,我希望向他们显示“请输入有效日期”。我希望能够在击键时这样做,这样当他们输入'a'和'ab'以及'abc'时,他们会得到相同的错误

问题在于,在值能够解析为日期之前,日期选择器似乎没有设置模型值及其错误。我之所以知道这一点,是因为表单控件不是脏的,并且在键入“abc”时仍然有一个required错误


可以这样做吗?

您可以在“日期更改”上附加一个处理程序,该处理程序在更改mat日期选择器的输入字段时触发,并验证用户输入

您还可以尝试mat datepicker的“dateInput”

提及

更新

HTML

TS


我看到了,但不幸的是,只有当用户将标签移出字段时才会调用它?下面是堆栈闪电战。不幸的是,dateInput和dateChange只有在认为可以解析日期时才会触发。更新了答案,您可以使用我们的传统键盘活动。谢谢。keyUp事件起作用。它最终对我们来说是笨拙的,因为我们有一个通用的页面验证,只有当一个字段变脏或b用户按下save时才会触发。在这种情况下,字段不是脏的,因为它无法解析。我可以用样板代码绕过这一点,但根据使用的位置的数量,它开始变得难看。你的问题陈述说你需要对按键进行验证,对吗?面对同样的问题。你找到解决办法了吗?
<input matInput [matDatepicker]="picker" placeholder="Input & change events"
     (dateInput)="addEvent('input', $event)" (dateChange)="addEvent('change', $event)" (keyup)="keyEvent('keyUp', $event)">
import {Component} from '@angular/core';
import {MatDatepickerInputEvent} from '@angular/material/datepicker';

    /** @title Datepicker input and change events */
    @Component({
      selector: 'datepicker-events-example',
      templateUrl: 'datepicker-events-example.html',
      styleUrls: ['datepicker-events-example.css'],
    })
    export class DatepickerEventsExample {
      events: string[] = [];

      addEvent(type: string, event: MatDatepickerInputEvent<Date>) {
        this.events.push(`${type}: ${event.value}`);
      }

      keyEvent(type: string, event: KeyboardEvent) {
        this.events.push(`${type}: ${event.target.value}`);
      }
    }
add [min] and [max] property like below code :-

i added min Date as 2020 (its mean you can not select less than 2020)
I added max Date as 7 day ahead from current date (you can not select after 7day`s ahead future date)

You can change as per your requirement , now you can get the idea to set calender validation    

   <mat-form-field class="full-width">
                <mat-label>Purchase Date</mat-label>
                <input
                  matInput
                  readonly
                  [min]="minDate" 
                  [max]="maxDate"
                  placeholder="Choose a Date"
                  (dateChange)="changeDate($event)"
                  formControlName="date_of_purchase"
                  [matDatepicker]="picker"
                />
                <mat-datepicker-toggle
                  matSuffix
                  [for]="picker"
                ></mat-datepicker-toggle>
                <mat-datepicker #picker></mat-datepicker>
              </mat-form-field>
    
    
    ts
    
      minDate = new Date(2000, 0, 1);
      today = new Date();
      maxDate = new Date();
    
    constructor(
        
        private router: Router,
        
      ) {
        
        this.maxDate = new Date(this.today.setDate(this.today.getDate() + 7));
        this._fillForm();
      }