diretiva angular ignora input não numérica

Eu tenho que escrever algum código para o IE8. Eu tenho um ng-repeat criando uma tabela preenchida com:

 

IE8 não fará type = number

Eu quero uma diretiva que irá ignorar os traços de tecla no campo de input que não são chaves numéricas …. ou seja … 0 – 9

Eu não quero deixar o usuário digitar abc e poluir o modelo e, em seguida, dizer a eles que o valor é inválido. Prefiro não permitir que eles insiram dados que não são válidos.

HTML:

  

Directiva:

 app.directive('productionQty', function() { return { require: 'ngModel', link: function (scope, element, attr, ngModelCtrl) { function fromUser(text) { var transformedInput = text.replace(/[^0-9]/g, ''); console.log(transformedInput); if(transformedInput !== text) { ngModelCtrl.$setViewValue(transformedInput); ngModelCtrl.$render(); } return transformedInput; // or return Number(transformedInput) } ngModelCtrl.$parsers.push(fromUser); } }; }); 

Plunker

Veja também filtros no ng-model em uma input . Minha resposta acima é baseada na resposta do pkozlowski.opensource.

Eu olhei para o padrão ng, mas ele não filtra o que é mostrado na checkbox de texto. Ele define $scope.qty1 como undefined , mas os caracteres indesejados são visíveis na checkbox de texto.

HTML:

  

Directiva:

 directive('onlyNum', function() { return function(scope, element, attrs) { var keyCode = [8, 9, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110]; element.bind("keydown", function(event) { //console.log($.inArray(event.which,keyCode)); if ($.inArray(event.which, keyCode) === -1) { scope.$apply(function() { scope.$eval(attrs.onlyNum); event.preventDefault(); }); event.preventDefault(); } }); }; }); 

Primeiro inclua este código no arquivo js numericInput.js

Directiva: –

 .directive('numeric', function() { return function(scope, element, attrs) { $(element[0]).numericInput({ allowFloat: true }); }; }) 

HTML: –

   

Demo Demonstração Numérica

não diretiva, mas eu uso apenas:

controlador:

  $scope.blockNonNumber = function (val, field){ $scope[field] = val.toString().replace(/[^0-9]/g, ''); } 

html:

  

não é directiva, mas pode ser usado em diretiva como wellside