как добавить тире / дефис в поле ввода после 2 цифр angular 4

#angular #typescript #mask #directive

#angular #typescript #маска #директива

Вопрос:

эй, я хочу добавить тире, когда пользователь вводит дату рождения вручную. как это 08-18-2019, но я не могу этого сделать

  public dateOfBirth: { year: number; month: number; day: number };
  

html-файл

  <input
          ngbDatepicker
          dobMask
          #d="ngbDatepicker"
          #dobF="ngModel"
          class="form-control input-underline input-lg"
          id="dob"
          [(ngModel)]="dateOfBirth"
          placeholder="mm-dd-yyyy"
          name="dp"
          [ngClass]="{
            invalid:
              (dobF.value === null || isString(dobF.value) || futureDate) amp;amp; dobF.touched
          }"
          required
        />
  

я пробовал директиву, но результат примерно такой
11———3

вот мой код директивы

 @Directive({
selector: '[dobMask]'
})
export class DobDirective {

@HostListener('input', ['$event'])
onKeyDown(event: KeyboardEvent) {
const input = event.target as HTMLInputElement;

let trimmed = input.value.replace(/s /g, '');
if (trimmed.length > 8) {
  trimmed = trimmed.substr(0, 8);
}

let numbers = [];
for (let i = 0; i < trimmed.length; i  = 2) {
  numbers.push(trimmed.substr(i, 2));
}

input.value = numbers.join('-');

  }
}
  

это то, что я получаю

введите описание изображения здесь

мой ожидаемый результат, т.е. 17.08.2019

кто-нибудь может мне помочь, как я могу этого добиться?

Ответ №1:

Немного изменил вашу директиву, и она работает нормально

 import {Directive,HostListener} from '@angular/core'

@Directive({
selector: '[dobMask]'
})
export class DobDirective {

@HostListener('input', ['$event'])
onKeyDown(event: KeyboardEvent) {
const input = event.target as HTMLInputElement;

let trimmed = input.value.replace(/s /g, '');

if (trimmed.length > 10) {
  trimmed = trimmed.substr(0, 10);
}


trimmed = trimmed.replace(/-/g,'');

 let numbers = [];
  numbers.push(trimmed.substr(0,2));
 if(trimmed.substr(2,2)!=="")
 numbers.push(trimmed.substr(2,2));
 if(trimmed.substr(4,4)!="")
 numbers.push(trimmed.substr(4,4));
input.value = numbers.join('-');

  }
}
  
  1. Первая проблема заключалась в том, что вы обрезали длину 8, она должна быть 10
    (включая ‘-‘)

    1. Затем для цикла вы всегда увеличиваете 2, что не сработает, так как нам требуется 4 значения в последнем элементе.

    2. Также вам необходимо удалить ‘-‘, прежде чем продолжить свою логику.

проверьте это

https://stackblitz.com/edit/angular-8dnjfw

Комментарии:

1. это сработало частично, но пробел не работает, например, если я напишу 02-09-2019, затем я удалю его с помощью backspace, он просто удалит 2019 год и застрянет 02-09 — @Midhun Murali

2. означает, что 2 тире не удаляются

3. @UsmanSaleem только что обновил ответ, добавив проверку перед отправкой в массив.

Ответ №2:

Возможно, вы захотите использовать ngModelChange следующим образом:

 <input [ngModel]="dateOfBirth" (ngModelChange)="updateDateOfBirth($event)">
  

затем в файле controller .ts:

 updateDateOfBirth(dob) {
  // some logic to insert hyphens if it is in a valid format
  // pseduocode:
  // IF dob matches required format THEN
  //   dob = dob with Hyphens inserted
  this.dateOfBirth = dob
}
  

dob будет обновляться в элементе управления формой из-за привязки [ngModel]="dateOfBirth"

Комментарии:

1. что такое dob? директива @danday74

2. dob — это текущее значение на входе, которое ngOnChanges позволяет вам изменять, что, в свою очередь, обновит входное значение с изменениями