J'utilise ngChange dans AngularJS pour déclencher une fonction personnalisée qui supprimera toutes les lettres que l'utilisateur ajoute à l'entrée.
<input type="text" name="inputName" data-ng-change="numbersOnly()"/>
Le problème est que je dois cibler l'entrée qui s'est déclenchée numbersOnly()
afin de pouvoir supprimer les lettres entrées. J'ai cherché longuement et attentivement sur Google et je n'ai rien trouvé à ce sujet.
Que puis-je faire?
javascript
angularjs
angularjs-directive
Chris Bier
la source
la source
Réponses:
Facile , utilisez type = "number" si cela fonctionne pour votre cas d'utilisation:
Un autre moyen simple: ng-pattern peut également être utilisé pour définir une regex qui limitera ce qui est autorisé dans le champ. Voir aussi la page "livre de recettes" sur les formulaires .
Hackish? façon , $ regardez le ng-model dans votre contrôleur:
Manette:
La meilleure façon , utilisez un analyseur $ dans une directive. Je ne vais pas répéter la déjà bonne réponse fournie par @ pkozlowski.opensource, alors voici le lien: https://stackoverflow.com/a/14425022/215945
Toutes les solutions ci-dessus impliquent l'utilisation de ng-model, ce qui rend la recherche
this
inutile.L'utilisation de ng-change posera des problèmes. Voir AngularJS - la réinitialisation de $ scope.value ne change pas la valeur dans le modèle (comportement aléatoire)
la source
type=number
affichera automatiquement le spinner, ce qui peut être indésirable. Vous pouvez masquer le spinner via css, mais encore une fois, même cela peut ne pas fonctionner sur tous les navigateurs.Utilisation
ng-pattern
sur le champ de texte:Ensuite, incluez-le sur votre manette
la source
Aucune des solutions proposées ne fonctionnait bien pour moi, et après quelques heures, j'ai finalement trouvé le chemin.
C'est la directive angulaire:
Et l'entrée ressemblerait à:
L'expression régulière évalue la touche enfoncée, pas la valeur .
Il fonctionne également parfaitement avec les entrées
type="number"
car empêche de changer sa valeur, donc la clé n'est jamais affichée et elle ne gâche pas le modèle.la source
restrict-to="[0-9\-]"
Voici ma mise en œuvre de la
$parser
solution que @Mark Rajcok recommande comme la meilleure méthode. C'est essentiellement l' excellent analyseur $ de @ pkozlowski.opensource pour la réponse textuelle, mais réécrit pour n'autoriser que les chiffres. Tout le mérite lui revient, c'est juste pour vous épargner les 5 minutes de lecture de cette réponse puis de réécrire la vôtre:Et vous l'utiliseriez comme ceci:
Fait intéressant, les espaces n'atteignent jamais l'analyseur syntaxique à moins d'être entourés d'un alphanumérique, vous devrez donc le faire
.trim()
si nécessaire. En outre, cet analyseur ne fonctionne PAS<input type="number">
. Pour une raison quelconque, les non-numériques ne parviennent jamais à l'analyseur où ils seraient supprimés, mais ils le font dans le contrôle d'entrée lui-même.la source
var transformedInput = inputValue ? inputValue.replace(/[^\d.-]/g,'') : null;
ng-trim
surfalse
pour vous assurer que les espaces atteignent votre analyseur.modelCtrl.$commitViewValue();
entre le $ setViewValue (clean); et $ render ();Il y a quelques façons de le faire.
Vous pouvez utiliser
type="number"
:Alternativement - J'ai créé une directive réutilisable pour cela qui utilise une expression régulière.
HTML
Javascript
la source
Voici une très bonne solution pour ne permettre que d'entrer un numéro dans
input
:la source
Toutes les solutions ci-dessus sont assez importantes, je voulais donner mes 2 cents à ce sujet.
Je vérifie seulement si la valeur saisie est un nombre ou non, et vérifie si elle n'est pas vide, c'est tout.
Voici le html:
Voici le JS:
C'est assez simple.
Je crois que cela ne fonctionnera pas sur Paste tho, juste pour qu'il soit connu.
Pour Paste, je pense que vous auriez besoin d'utiliser l'événement onChange et d'analyser toute la chaîne, une autre bête, le tamme. Ceci est spécifique à la saisie.
UPDATE for Paste : ajoutez simplement cette fonction JS:
Et l'entrée html ajoute le déclencheur:
J'espère que cela aide o /
la source
Voici un Plunker qui gère toute situation ci-dessus que la proposition ne gère pas.
En utilisant $ formatters et $ parsers pipeline et en évitant type = "number"
Et voici l'explication des problèmes / solutions (également disponible dans le Plunker):
la source
vous pouvez utiliser un attribut numérique uniquement.
la source
DÉCIMAL
CHIFFRES
directives angulaires pour valider les nombres
la source
Je sais que c'est vieux, mais j'ai créé une directive à cet effet au cas où quelqu'un chercherait une solution simple. Très simple à utiliser.
Vous pouvez le vérifier ici .
la source
vous pouvez également supprimer le 0 au début de l'entrée ... J'ajoute simplement un bloc if à la réponse Mordred ci-dessus car je ne peux pas encore faire de commentaire ...
la source
Essaye ça,
la source
SOLUTION: je crée une directive pour toutes les entrées, nombre, texte ou autre, dans l'application, afin que vous puissiez saisir une valeur et modifier l'événement. Faire pour angulaire 6
HTML
la source
J'ai fini par créer une directive modifiée du code ci-dessus pour accepter l'entrée et changer le format à la volée ...
})
la source
la source
HTML de base
Bootstrap de base
la source
<input class="form-control" type="number" >