Я считаю, что намерение входов и ngModel
директивы AngularJS состоит в том, что недопустимые входные данные никогда не должны попадать в модель . Модель всегда должна быть действующей. Проблема с недопустимой моделью заключается в том, что у нас могут быть наблюдатели, которые запускают и предпринимают (несоответствующие) действия на основе недопустимой модели.
На мой взгляд, правильное решение здесь - подключиться к $parsers
конвейеру и убедиться, что недопустимый ввод не попадает в модель. Я не знаю , как вы пытались приблизиться к вещи или что конкретно не работать для вас , $parsers
но здесь это простая директива , которая решит проблему (или , по крайней мере , в моем понимании проблемы):
app.directive('customValidation', function(){
return {
require: 'ngModel',
link: function(scope, element, attrs, modelCtrl) {
modelCtrl.$parsers.push(function (inputValue) {
var transformedInput = inputValue.toLowerCase().replace(/ /g, '');
if (transformedInput!=inputValue) {
modelCtrl.$setViewValue(transformedInput);
modelCtrl.$render();
}
return transformedInput;
});
}
};
});
Как только указанная выше директива объявлена, ее можно использовать так:
<input ng-model="sth" ng-trim="false" custom-validation>
Как и в решении, предложенном @Valentyn Shybanov, нам нужно использовать ng-trim
директиву, если мы хотим запретить пробелы в начале / конце ввода.
Преимущество такого подхода двоякое:
- Недействительное значение не распространяется на модель
- Используя директиву, легко добавить эту настраиваемую проверку к любому входу, не дублируя наблюдателей снова и снова.