Não registre valores inválidos com ng-model
Eu realmente gosto de como o atributo ng-model se liga diretamente ao meu modelo e os usuários recebem feedback instantâneo sobre suas mudanças. Para o meu caso de uso, isso é perfeito. No entanto, não quero que valores inválidos sejam colocados no modelo em que eles possam alterar os cálculos. De alguma forma, quero que o modelo seja atualizado apenas se o valor no controle de formulário for válido. Para valores inválidos, é bom que o valor de controle seja alterado enquanto o valor do modelo permanece fixo.
Se eu mudar a fonte da implementação $ setViewValue do NgModelController:
this.$setViewValue = function(value) {
...
if (this.$modelValue !== value) {
this.$modelValue = value;
...
}
};
Para isso:
this.$setViewValue = function(value) {
...
if (this.$modelValue !== value && this.$valid) {
this.$modelValue = value;
...
}
};
Parece fazer exatamente o que eu quero, mas não sei como fazer isso de maneira apropriada. Qual é o caminho certo para mudar esse comportamento? Ou minhas tentativas estão fadadas ao fracasso por algum motivo?
Atualização: exemplo adicionado.
Por exemplo, olhe parahttp://jsfiddle.net/FJvgK/1/ HTML:
<div ng-controller="MyCtrl">
{{validNumber}}
<form>
<input
type="number"
ng-model="validNumber"
required
min="10"
max="20"
/>
</form>
</div>
E o JS:
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.validNumber = 15;
}
O número é exibido corretamente para valores entre 10 e 20, mas eu quero que, se você digitar "8" de repente na caixa, ou excluir o segundo dígito, deixando "1" o último número válido ainda mostrado acima. Ou seja, o modelo sempre tem um valor válido, mesmo que o controle não tenha.