Я вважаю, що задум AngularJS та ngModel
директива полягає в тому, що недійсний вхід ніколи не повинен опинятися в моделі . Модель завжди повинна бути дійсною. Проблема з невірною моделлю полягає в тому, що у нас можуть бути спостерігачі, які стріляють і вживають (невідповідні) дії на основі недійсної моделі.
Як я бачу, правильне рішення тут - підключитись до $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
директиву, якщо ми хочемо заборонити пробіли на початку / кінці введення.
Перевага такого підходу - дворазова:
- Недійсне значення не поширюється на модель
- Використовуючи директиву, легко додати цю власну перевірку на будь-який вхід, не копіюючи спостерігачів знову і знову