如何在角度材料日期选择器上添加蒙版

iva*_*eva 5 angular

我最近开始使用角度材料来构建角度形式,其中我需要使用角度材料日期选择器,但无法在输入元素上添加任何掩码。

我希望用户只能输入数字并在输入时将其格式化为日期格式(MM/DD/YYYY)。

html

<div class="example-container">
  <mat-form-field appearance="outline" class="col-sm-12 col-md-6 col-lg-6 required margin-top-ten">
    <mat-label>
      <span class="title">Date of Birth (MM/DD/YYYY)</span>  
    </mat-label>
    <input matInput [matDatepicker]="myDatepicker" formControlName="dateOfBirth" maxlength="10">
    <mat-datepicker-toggle matSuffix [for]="myDatepicker"></mat-datepicker-toggle>
    <mat-datepicker #myDatepicker></mat-datepicker>  
  </mat-form-field>
</div>
Run Code Online (Sandbox Code Playgroud)

注意:我试图使用ngx-mask并且不仅仅在日期选择器上工作,在电话或传真字段等常规文本输入上工作得很好。

Иии*_*Лее 5

创建指令

import { Directive, ElementRef, OnDestroy } from '@angular/core';
import * as textMask from 'vanilla-text-mask/dist/vanillaTextMask.js';

@Directive({
  selector: '[appMaskDate]'
})
export class MaskDateDirective implements OnDestroy {

  mask = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/]; // dd/mm/yyyy
  maskedInputController;

  constructor(private element: ElementRef) {
    this.maskedInputController = textMask.maskInput({
      inputElement: this.element.nativeElement,
      mask: this.mask
    });
  }

  ngOnDestroy() {
    this.maskedInputController.destroy();
  }

}
Run Code Online (Sandbox Code Playgroud)

使用掩码选择器作为日期选择器输入

  <input matInput [matDatepicker]="dateOfBirth" #dateOfBirth appMaskDate>
Run Code Online (Sandbox Code Playgroud)

添加对材质日期选择器自己的输入的订阅

  eventSubscription: Subscription;
  @ViewChild('dateOfBirth') dateOfBirth: ElementRef;
  @ViewChild(MatDatepickerInput) datepickerInput: MatDatepickerInput<any>; 
Run Code Online (Sandbox Code Playgroud)

并在 ngAfterViewInit 上

   this.eventSubscription = fromEvent(this.dateOfBirth.nativeElement, 'input').subscribe(_ => {
      this.datepickerInput._onInput(this.dateOfBirth.nativeElement.value);
    });
Run Code Online (Sandbox Code Playgroud)