Uważam, że intencją danych wejściowych i ngModel
dyrektywy AngularJS jest, aby nieprawidłowe dane wejściowe nigdy nie trafiały do modelu . Model powinien być zawsze aktualny. Problem z posiadaniem nieprawidłowego modelu polega na tym, że możemy mieć obserwatorów, którzy odpalają i podejmują (nieodpowiednie) działania w oparciu o nieprawidłowy model.
Jak widzę, właściwym rozwiązaniem jest tutaj podłączenie do $parsers
potoku i upewnienie się, że nieprawidłowe dane wejściowe nie trafią do modelu. Nie jestem pewien, jak próbowałeś podejść do rzeczy lub co dokładnie Ci się nie udało, $parsers
ale oto prosta dyrektywa, która rozwiązuje Twój problem (lub przynajmniej moje zrozumienie problemu):
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;
});
}
};
});
Jak tylko powyższa dyrektywa zostanie zadeklarowana, może być używana w następujący sposób:
<input ng-model="sth" ng-trim="false" custom-validation>
Podobnie jak w rozwiązaniu zaproponowanym przez @Valentyn Shybanov musimy użyć ng-trim
dyrektywy, jeśli chcemy zabronić spacji na początku / końcu wejścia.
Zaleta tego podejścia jest 2-krotna:
- Nieprawidłowa wartość nie jest propagowana do modelu
- Korzystając z dyrektywy, łatwo jest dodać tę niestandardową weryfikację do dowolnego wejścia bez ciągłego powielania obserwatorów