AngularJS girdilerinin ve ngModel
yönergesinin amacının, geçersiz girdinin modelde asla bitmemesi olduğuna inanıyorum . Model her zaman geçerli olmalıdır. Geçersiz modele sahip olmakla ilgili sorun, geçersiz modele dayanarak ateş açan ve (uygunsuz) eylemler gerçekleştiren izleyicilerimiz olabilir.
Gördüğüm kadarıyla, buradaki doğru çözüm, $parsers
ardışık düzene bağlamak ve geçersiz girişin onu modele dahil etmediğinden emin olmaktır. Bir şeylere nasıl yaklaşmaya çalıştığından veya neyin işe yaramadığından emin değilim $parsers
ama işte probleminizi çözen basit bir yönerge (veya en azından benim problemi anladığım):
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;
});
}
};
});
Yukarıdaki yönerge ilan edilir edilmez şu şekilde kullanılabilir:
<input ng-model="sth" ng-trim="false" custom-validation>
@Valentyn Shybanov tarafından önerilen çözümde olduğu gibi, girdinin ng-trim
başında / sonunda boşluklara izin vermemek istiyorsak yönergeyi kullanmamız gerekir .
Bu yaklaşımın avantajı 2 katlıdır:
- Geçersiz değer modele yayılmaz
- Bir yönerge kullanarak, bu özel doğrulamayı, izleyenleri tekrar tekrar kopyalamadan herhangi bir girdiye eklemek kolaydır.