Aucune des solutions proposées n'a fonctionné pour moi, et après quelques heures, j'ai finalement trouvé la solution.
C'est la directive angulaire :
angular.module('app').directive('restrictTo', function() {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var re = RegExp(attrs.restrictTo);
var exclude = /Backspace|Enter|Tab|Delete|Del|ArrowUp|Up|ArrowDown|Down|ArrowLeft|Left|ArrowRight|Right/;
element[0].addEventListener('keydown', function(event) {
if (!exclude.test(event.key) && !re.test(event.key)) {
event.preventDefault();
}
});
}
}
});
Et l'entrée ressemblerait à :
<input type="number" min="0" name="inputName" ng-model="myModel" restrict-to="[0-9]">
L'expression régulière évalue la touche pressée, pas la valeur .
Il fonctionne aussi parfaitement avec les entrées type="number"
parce qu'elle empêche de changer sa valeur, de sorte que la clé n'est jamais affichée et qu'elle ne perturbe pas le modèle.