J'ai une entrée de texte et je ne veux pas autoriser les utilisateurs à utiliser des espaces, et tout ce qui est tapé sera transformé en minuscules.
Je sais que je ne suis pas autorisé à utiliser des filtres sur le modèle ng, par exemple.
ng-model='tags | lowercase | no_spaces'
J'ai regardé créer ma propre directive mais ajouter des fonctions $parsers
et $formatters
ne pas mettre à jour l'entrée, seulement d'autres éléments qui y étaient ng-model
.
Comment puis-je modifier l'entrée de ce que je suis en train de saisir?
J'essaie essentiellement de créer la fonctionnalité «balises» qui fonctionne exactement comme celle ici sur StackOverflow.
angularjs
angularjs-filter
dom-manipulation
angularjs-ng-model
Andrew WC Brown
la source
la source
Réponses:
Je suggérerais de regarder la valeur du modèle et de la mettre à jour lors du changement: http://plnkr.co/edit/Mb0uRyIIv1eK8nTg3Qng?p=preview
Le seul problème intéressant concerne les espaces: dans AngularJS 1.0.3 ng-model à l'entrée coupe automatiquement la chaîne, il ne détecte donc pas que le modèle a été modifié si vous ajoutez des espaces à la fin ou au début (les espaces ne sont donc pas automatiquement supprimés par mon code). Mais en 1.1.1 il y a une directive 'ng-trim' qui permet de désactiver cette fonctionnalité ( commit ). J'ai donc décidé d'utiliser 1.1.1 pour obtenir la fonctionnalité exacte que vous avez décrite dans votre question.
la source
$watch
force l'écouteur à être à nouveau appelé. Dans les cas simples (où votre filtre est idempotent), vous vous retrouverez avec le filtre s'exécutant deux fois à chaque modification.Je crois que l'intention des entrées AngularJS et de la
ngModel
directive est qu'une entrée invalide ne devrait jamais se retrouver dans le modèle . Le modèle doit toujours être valide. Le problème avec un modèle invalide est que nous pourrions avoir des observateurs qui déclenchent et prennent des actions (inappropriées) basées sur un modèle invalide.Selon moi, la solution appropriée ici est de se brancher sur le
$parsers
pipeline et de s'assurer que l'entrée invalide ne parvient pas à entrer dans le modèle. Je ne sais pas comment avez-vous essayé d'aborder les choses ou avec quoi exactement n'a pas fonctionné pour vous,$parsers
mais voici une directive simple qui résout votre problème (ou du moins ma compréhension du problème):Dès que la directive ci-dessus est déclarée, elle peut être utilisée comme suit:
Comme dans la solution proposée par @Valentyn Shybanov, nous devons utiliser la
ng-trim
directive si nous voulons interdire les espaces au début / à la fin de l'entrée.L'avantage de cette approche est double:
la source
modelCtrl.$setViewValue(transformedInput); modelCtrl.$render();
Useful serait un lien vers la documentation: docs.angularjs.org/api/ng.directive:ngModel.NgModelController Un mot pour "protéger" ma solition est que la propriété scope pourrait être modifiée non seulement à partir des vues et ma façon de couvrir cela. Je pense donc que la manière dont la portée pourrait être modifiée dépend d'une situation réelle.modelCtrl
est le contrôleur requis par la directive. (require 'ngModel'
)Une solution à ce problème pourrait être d'appliquer les filtres côté contrôleur:
$scope.tags = $filter('lowercase')($scope.tags);
N'oubliez pas de déclarer
$filter
comme dépendance.la source
Si vous utilisez un champ d'entrée en lecture seule, vous pouvez utiliser ng-value avec filter.
par exemple:
la source
Utilisez une directive qui ajoute à la fois aux collections $ formatters et $ parsers pour vous assurer que la transformation est effectuée dans les deux sens.
Voir cette autre réponse pour plus de détails, y compris un lien vers jsfiddle.
la source
J'ai eu un problème similaire et utilisé
dans mon gestionnaire, j'appelle une méthode de l'objetInScope pour se modifier correctement (entrée grossière). Dans le contrôleur, j'ai initié quelque part que
Je sais que cela n'utilise pas de filtres ou d'observateurs sophistiqués ... mais c'est simple et fonctionne très bien. Le seul inconvénient est que objectInScope est envoyé dans l'appel au gestionnaire ...
la source
Si vous effectuez une validation d'entrée asynchrone complexe, il peut valoir la peine d'abstraire
ng-model
un niveau dans le cadre d'une classe personnalisée avec ses propres méthodes de validation.https://plnkr.co/edit/gUnUjs0qHQwkq2vPZlpO?p=preview
html
code
la source
Tu peux essayer ça
la source