Проблемы
Максимальная длина элемента HTMLInput должна быть 5, в противном случае пользователь не сможет добавить 4 цифры после программного добавления косой черты.
Та же проблема существует в const trimmed = input.value.replace(/\s+/g, '').slice(0,4);
Если он содержит косую черту, срез должен заканчиваться на 5 вместо 4.
В return
выражение
return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(2)}`);
Если косая черта добавлена один раз, ${trimmed.slice(2)
вернет /\d{1,2}
. Поэтому вам нужно избегать косой черты и начинать с 3.
Решение
изменить максимальную длину до 5 с 4
<input ... maxlength="5">
Now, input-mask.directive.ts необходимо внести некоторые изменения
Изменить
const trimmed = input.value.replace(/\s+/g, '').slice(0,4);
на
const trimmed = input.value.replace(/\s+/g, '').slice(0, input.value.indexOf('/')==-1?4:5);
Поскольку при добавлении /
длина станет 5.
Не используйте .slice(0)
, потому что он позволяет пользователю вставлять 5 цифр, а когда вы добавляете косую черту, он становится 6. Таким образом, дата будет выглядеть как 11/111
вместо 11/11
Измените
return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(2)}`);
на
return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(trimmed.indexOf('/')==-1?2:3)}`);
Здесь ваш код испортился. Если он содержит косую черту, то вы должны нарезать его с 3. Иначе нарезать его с 2.
конечный код HostListener в директиве input-mask
@HostListener('input', ['$event'])
onKeyDown(event: KeyboardEvent) {
const input = event.target as HTMLInputElement;
const trimmed = input.value.replace(/\s+/g, '').slice(0, input.value.indexOf('/')==-1?4:5);
if (trimmed.length > 3) {
return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(trimmed.indexOf('/')==-1?2:3)}`);
}
}
Рабочий пример: stackblitz