Первое, на что я хочу указать:
Вы используете maxlength="8"
, что нормально, пока вы не начнете использовать валютную трубу. Символы, добавленные вашей валютной трубкой, будут приняты во внимание. Я не знаю, является ли это требуемым поведением, но оно определенно не интуитивно с точки зрения пользователя.
«Я вижу ограничение в 8 символов, я могу ввести до 8 символов» - это первое, о чем я подумаю при чтении сообщения проверки. Я не хочу думать о форматировании валюты самостоятельно, пока я ввожу свое (в то время) неформатированное число.
Я бы сказал, что либо получим maxLength
14 (8 + 1 доллар) знак + 2 запятых + 1 точка + двойные цифры - максимально возможное число для USD = 14 символов) и оставьте сообщение проверки в качестве значения как 8. Или, если вы действительно хотите только 8 символов после форматирования, установите значение сообщения проверки как 3 ( 3 + 1 знак доллара + 1 запятая + 1 точка + двойные цифры = 7) после форматирования 4 цифры переходят к 9 символам, потому что добавляется дополнительная ди git + запятая, идущая к 9 символам, что больше maxLength 8 .
Вы также можете использовать пользовательскую проверку длины и правильно проверить себя (что хорошо, если формат валюты может отличаться) вместо того, чтобы полагаться на универсальный c *ngIf="amt && eoInfo.amount.invalid"
Теперь для вашей актуальной проблемы, решение, которое я думаю, было бы неплохо, это удалить форматирование во время редактирования. Для пользователя никогда не бывает практичным редактировать, и ему приходится перемещаться по .
,
и $
, когда все, что их волнует при редактировании, это действительно цифры. Вы можете создать «обратную валютную трубу», когда пользователь фокусирует поле так, что все, что он видит, это число.
Я сделал быструю форк из вашей Stackblitz demo с предположением, что макс. длина относится к числу цифр перед десятичной точкой.
Дайте мне знать, если что-то нужно изменить, и поможет ли это вообще решить вашу проблему.