Creo que la intención de las entradas de AngularJS y la ngModel
direccional es que la entrada no válida nunca termine en el modelo . El modelo siempre debe ser válido. El problema con tener un modelo no válido es que podríamos tener observadores que disparen y tomen acciones (inapropiadas) basadas en un modelo no válido.
Tal como lo veo, la solución adecuada aquí es conectarse a la $parsers
tubería y asegurarse de que la entrada no válida no llegue al modelo. No estoy seguro de cómo trató de abordar las cosas o con qué no funcionó exactamente para usted, $parsers
pero aquí hay una directiva simple que resuelve su problema (o al menos mi comprensión del problema):
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;
});
}
};
});
Tan pronto como se declare la directiva anterior, se puede usar así:
<input ng-model="sth" ng-trim="false" custom-validation>
Como en la solución propuesta por @Valentyn Shybanov, necesitamos usar la ng-trim
directiva si queremos no permitir espacios al principio / al final de la entrada.
La ventaja de este enfoque es doble:
- El valor no válido no se propaga al modelo.
- Con una directiva, es fácil agregar esta validación personalizada a cualquier entrada sin duplicar observadores una y otra vez