ScarletFlash
@ScarletFlash

Почему одно и то же значение в input то валидно, то нет?

Всем привет.

Столкнулся с непонятной мне вещью при работе с формами Angular.
Валидация ведет себя непредсказуемым образом, но удалось выявить несколько закономерностей:
– Цифры всегда валидны
– Буквы валидны при добавлении
– Буквы невалидны при удалении

Подскажите, почему оно так работает и как избежать такого непостоянства?
Как это выглядит в жизни
5b967f62bfe83122120782.gif
В консоль пишу из функции:
validate(control: FormControl) {
        const pattern: RegExp = namePatternExp;
        console.log(control.value, pattern.test(toString(control.value)));
        return pattern.test(toString(control.value)) ? null : {
            validate: {
                valid: false
            }
        };
    }

toString из Lodash – ни на что не влияет. Без него то же самое.
namePatternExp такой: [a-zA-Z ]* (от отчаяния взял из оф. документации Angular)

  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ответы на вопрос 2
dollar
@dollar
Делай добро и бросай его в воду.
Предлагаю такой простой эксперимент в консоли:
5b968baf9dc20559535666.png
Ответ написан
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
ссылки для размышления
jsfiddle.net/xuxicheta/41rvdwh0/7
https://angular-reactive-form-guuytj.stackblitz.io

https://learn.javascript.ru/regexp-methods#regexp-...
Там не написано, но regexp.test(str) c флагом g работает так же, как и exec.
Т.е. если есть g, то регэксп останавливается на последнем успешном совпадении и запоминает индекс. При следующем вызове начинает с него.

Когда вы добавляете 1 букву, следующей проверке скармливается отрезок начиная с lastIndex, т.е. это наша последняя добавленная буква. И он выдает true. Когда удаляете одну букву, lastIndex оказывается за границей строки и поиск с ошибкой возвращает false.
В случае с цифрой регэксп не находит ничего, и lastIndex остается 0, а поскольку ваше условие - любое количество букв, и нулевое количество букв тоже подходит, то возвращается true
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы