2015-03-06 3 views
0

У меня есть эта директива пользовательских проверок:Angularjs - Проверка исходного значения URL-адрес с пользовательской директивой

/** 
* Overwrites default url validation using Django's URL validator 
* Original source: http://stackoverflow.com/questions/21138574/overwriting-the-angularjs-url-validator 
*/ 
angular.module('dmn.vcInputUrl', []) 

.directive('vcUrl', function() { 

    // Match Django's URL validator, which allows schemeless urls. 
    var URL_REGEXP = /^((?:http|ftp)s?:\/\/)(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d+)?(?:\/?|[\/?]\S+)$/i; 

    var validator = function(value) { 
    if (!URL_REGEXP.test(value) && URL_REGEXP.test('http://' + value)) { 
     return 'http://' + value; 
     } else { 
     return value; 
     } 
    } 

    return { 
    require: '?ngModel', 
    link: function link(scope, element, attrs, ngModel) { 
     function allowSchemelessUrls() { 


     // Silently prefixes schemeless URLs with 'http://' when converting a view value to model value.  
     ngModel.$parsers.unshift(validator); 

     ngModel.$validators.url = function(value) { 
      return ngModel.$isEmpty(value) || URL_REGEXP.test(value); 
     }; 
     } 
     if (ngModel && attrs.type === 'url') { 
     allowSchemelessUrls(); 
     } 
    } 
    }; 
}); 

Он отлично работает, когда вы «грязный» вводу путем ввода или вставок, но мне нужно, чтобы запустить эту проверку, перезапись значения по умолчанию type="url", когда значение первоначально задано в ngModel.

Я попытался добавить ngModel.$formatters.unshift(validator);, но это приводит к добавлению «http: //» к вводу, которое мне нужно избегать, поскольку изменения пользователя одобрены вручную, и было бы пустой тратой времени, чтобы утвердить добавление 'HTTP: //'.

Любая помощь будет оценена!

+0

Если вы используете AngularJS> = 1,3, то вы должны смотреть на новый $ валидатора трубопровода: http://www.yearofmoo.com/2014/09/taming-forms-in-angularjs-1-3.html#the-validators-pipeline – DanEEStar

ответ

0

Набор нг-модель-опции на поле ввода типа, например:

<input type="text" 
 
ng-model-options="{ updateOn: 'default', debounce: {'default': 0} }"</input>

Это обеспечит ваш валидатор увольняют «когда значение первоначально устанавливается в ngModel» , как вы заявили в вопросе.

Показать подробную AngularJs documentaion на ngModelOptions: enter link description here

-2

валидацию URL:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<form name="form"> 
 
     URL: <input type="url" ng-model="url.text" placeholder="Enter Link" name="fb_link"></input> 
 
<span class="error" ng-show="form.fb_link.$error.url"></span> 
 
</form>

Смежные вопросы