Как сделать валидацию в angular?

Нужно сделать страничку с использованием Angular.
Пустая белая страница по середине которой должен находиться input.
В input можно вводить только символы {}[]()
Если вводится любой другой символ под инпутом нужно вывести текст "Вы ввели недопустимые символы" - проверка должна быть сразу в момент ввода значений.

По введенной строке нужно сделать валидацию открытых - закрытых скобок, а именно каждой открытой скобке должна соответствовать закрытая. Скобки можно вкладывать в другие скобки. Например:
{[()]({})} - валидно
{()}()[{}] - валидно
{{(})} - не валидно
{) - не валидно
[{}]) - не валидно

Результат проверки нужно писать под полем, проверка должна быть сразу в момент ввода значений.
Я пошел путем стека и он работает когда вводить символы, а когда их удалять из инпута стек наполняется. И еще одно, что делать когда пользователь передвинет курсор где-то в середину набраной строки и там будет что-то вводить?
  • Вопрос задан
  • 420 просмотров
Решения вопроса 1
А зачем так сложно? Сделайте функцию проверки валидности и вызывайте её при каждом изменении модели.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
читаем документацию к ngModelController, добавляем туда свой валидатор в виде директивы-атрибута для инпута.
Ответ написан
Комментировать
Myrzik
@Myrzik Автор вопроса
.directive('brackets', function() {
    return {
      require: 'ngModel',
      link: function(scope, elm, attrs, ctrl) {
        var stack = [];
        ctrl.$parsers.unshift(function(brackets) {
          var pushed = function(el) {
            var numLastElemStack = stack.length;
            if (stack[numLastElemStack -1] === '{' && el === '}' || stack[numLastElemStack -1] === '[' && el === ']' ||
            stack[numLastElemStack -1] === '(' && el === ')') {
              stack.pop();
            }
            else {
              stack.push(el);
              return 'no valid';
            }

          };
          if (/^[\[|\]|\(|\)|\{|\}]+$/.test(brackets)) {
            var lastCharacter = brackets.substr(-1);
              return pushed(lastCharacter);
          } else {
            return 'no valid';
          }

        });
      }
    };
  })

Я сделал вот так, может вы подтолкнете меня на правильное решение?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы