Ich glaube, dass die Absicht von AngularJS-Eingaben und der ngModel
Anweisung ist, dass ungültige Eingaben niemals im Modell landen sollten . Das Modell sollte immer gültig sein. Das Problem mit einem ungültigen Modell besteht darin, dass wir möglicherweise Beobachter haben, die auf der Grundlage eines ungültigen Modells feuern und (unangemessene) Maßnahmen ergreifen.
Aus meiner Sicht besteht die richtige Lösung darin, die $parsers
Pipeline anzuschließen und sicherzustellen, dass ungültige Eingaben nicht in das Modell gelangen. Ich bin mir nicht sicher, wie Sie versucht haben, Dinge anzugehen oder was genau bei Ihnen nicht funktioniert hat, $parsers
aber hier ist eine einfache Anweisung, die Ihr Problem (oder zumindest mein Verständnis des Problems) löst:
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;
});
}
};
});
Sobald die obige Richtlinie deklariert ist, kann sie wie folgt verwendet werden:
<input ng-model="sth" ng-trim="false" custom-validation>
Wie in der von @Valentyn Shybanov vorgeschlagenen Lösung müssen wir die ng-trim
Direktive verwenden, wenn Leerzeichen am Anfang / Ende der Eingabe nicht zugelassen werden sollen.
Der Vorteil dieses Ansatzes ist zweifach:
- Ein ungültiger Wert wird nicht an das Modell weitergegeben
- Mit einer Direktive ist es einfach, diese benutzerdefinierte Validierung zu jeder Eingabe hinzuzufügen, ohne die Beobachter immer wieder zu duplizieren