как добавить тире / дефис в поле ввода после 2 цифр угловой 4 - PullRequest
1 голос
/ 09 апреля 2019

эй, я хочу добавить тире, когда пользователь вводит дату рождения вручную. как это 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) && 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('-');

  }
}

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

enter image description here

мой ожидаемый результат т.е. 08-17-2019

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

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

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

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 (включая '-')

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

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

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

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

0 голосов
/ 09 апреля 2019

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

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

, затем в файле .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"

...