2015-06-24 2 views
4

В AngularJS для проверки форм могут использоваться как $ parsers, так и $ validators. Мне было интересно, в чем разница между использованием парсера $ и использованием $ validator.

Давайте посмотрим на следующем примере:

проверки с использованием парсер

angular.module("myFormApp") 
    .directive("containsWhiteSpace", containsWhiteSpace); 

function containsWhiteSpace() { 

    function hasWhiteSpace(s) { 
     return s.indexOf(' ') >= 0; 
    } 

    return { 
     require: "ngModel", 
     link: function(scope, ele, attrs, ctrl){ 

      ctrl.$parsers.unshift(function(value) { 
       if(value){ 
        var isValid = !hasWhiteSpace(value); 
        ctrl.$setValidity('hasWhiteSpace', isValid); 
       } 

       return isValid ? value : undefined; 
      }); 

     } 
    } 
} 

Проверка с помощью валидатора

angular.module("myFormApp") 
    .directive("containsWhiteSpace", containsWhiteSpace); 

function containsWhiteSpace() { 

    function hasWhiteSpace(s) { 
     return s.indexOf(' ') >= 0; 
    } 

    return { 
     require: "ngModel", 
     link: function(scope, ele, attrs, ctrl){ 
      ctrl.$validators.hasWhiteSpace = function(value){ 
       return !hasWhiteSpace(value); 
      } 
     } 
    } 
} 

Они оба делают то же самое, но когда правильно ли использовать синтаксический анализатор и когда правильно использовать валидатор? В чем преимущества обоих? Каковы различия?

+2

$ validators был введен только в 1.3+, тогда как если вы используете <1.2, то вы используете $ parsers – gerl

ответ

7

$parsers выполнены в трубопроводе, чтобы преобразовать входное значение. Они могут возвращать undefined, если они не могут проанализировать ввод, указав ошибку синтаксического анализа. Если входное значение не удается разобрать, валидаторы не запускаются.

$validators запускаются после парсеров при анализируемом значении. Они могут возвращать false, чтобы указать на ошибку данных.

В основном

  • использование парсеры принуждать входное значение строки в тип данных вам нужно/ожидать.
  • использовать валидаторы для проверки правильности правильного типа данных.

Например, рассмотрим модель, требующую положительного числа. $parsers может вызывать parseFloat по значению, а $validators может проверить, положительно ли это значение.

Для примера, который вы дали, я думаю, что $validators являются более подходящими (и более чистыми).

+0

Спасибо, хорошее объяснение – koningdavid

+0

Что делать, если я хочу, когда я очищу поле, которое будет установлено на 'undefined' без моего анализатора считаться недействительным? Как мне это достичь? – Slim