125 votes

filtres angularjs ng-modèle dans une entrée

J'ai une saisie de texte et je ne veux pas autoriser les utilisateurs à utiliser des espaces, et tout tapé seront converties en minuscules.

Je sais que je ne suis pas autorisé à utiliser les filtres sur ng-model

par exemple. ng-model= "tags | minuscules | no_spaces'

J'ai regardé la création de mon propre directive, mais en ajoutant des fonctions de $analyseurs et $formateurs n'ai pas de mise à jour de l'entrée seulement d'autres éléments qui ont ng-model.

Comment puis-je changer l'entrée de que je suis en train de taper dans?

Je suis essentiellement en essayant de créer la "tags" caractéristique, qui fonctionne exactement comme celui qui est ici en stackoverflow.

206voto

Je crois que l'intention de AngularJS intrants et de l' ngModel direcive est que l'entrée non valide ne doit jamais se termine dans le modèle. Le modèle doit être toujours valide. Le problème avec le fait d'avoir modèle invalide est que nous puissions avoir des observateurs de l'incendie et de prendre (inapproprié) des actions fondées sur le modèle invalide.

À mes yeux, la bonne solution consiste à brancher sur l' $parsers pipeline et assurez-vous que l'entrée non valide n'est pas dans le modèle. Je ne suis pas sûr de savoir comment avez-vous essayer d'approche ou qu'est-ce exactement ne fonctionne pas pour vous, avec $parsers mais ici, c'est une directive simple qui permet de résoudre votre problème (ou au moins ma compréhension du problème):

app.directive('customValidation', function(){
   return {
     require: 'ngModel',
     link: function(scope, element, attrs, modelCtrl) {

       modelCtrl.$parsers.push(function (inputValue) {

         var transformedInput = inputValue.toLowerCase().replace(/ /g, ''); 

         if (transformedInput!=inputValue) {
           modelCtrl.$setViewValue(transformedInput);
           modelCtrl.$render();
         }         

         return transformedInput;         
       });
     }
   };
});

Dès que la directive ci-dessus est déclarée, il peut être utilisé comme:

<input ng-model="sth" ng-trim="false" custom-validation>

Comme dans la solution proposée par @Valentyn Shybanov nous avons besoin d'utiliser l' ng-trim directive, si nous voulons interdire les espaces au début et à la fin de l'entrée.

L'avantage de cette approche est de 2 fois:

  • Valeur non valide est pas propagé vers le modèle
  • À l'aide d'une directive, il est facile d'ajouter cette validation personnalisée à n'importe quelle entrée sans dupliquer les observateurs de, encore et encore

29voto

Valentyn Shybanov Points 8483

Je vous propose de regarder la valeur de modèle et de le mettre à jour sur chage: http://plnkr.co/edit/Mb0uRyIIv1eK8nTg3Qng?p=preview

La seule question intéressante est avec des espaces: Dans AngularJS 1.0.3 ng-model automatiquement sur l'entrée mic de la chaîne, de sorte qu'il ne détecte pas que le modèle a changé, si vous ajoutez des espaces à la fin ou au début (si les espaces ne sont pas supprimés automatiquement par mon code). Mais en 1.1.1, il est 'ng-trim" directive qui permet de désactiver cette fonctionnalité (commit). J'ai donc décidé d'utiliser 1.1.1 pour atteindre exactement la fonctionnalité décrite dans votre question.

23voto

Une solution à ce problème pourrait être d’appliquer les filtres du côté du contrôleur:

$scope.tags = $filter('lowercase')($scope.tags);

N'oubliez pas de déclarer $filter tant que dépendance.

3voto

wojjas Points 91

J'ai eu un problème similaire et utilisé

 ng-change="handler(objectInScope)" 
 

dans mon gestionnaire, j'appelle une méthode de objectInScope pour se modifier correctement (entrée grossière). Dans le contrôleur j'ai initié quelque part que

 $scope.objectInScope = myObject; 
 

Je sais que cela n’utilise pas de filtres sophistiqués ni d’observateurs ... mais c’est simple et fonctionne très bien. Le seul inconvénient, c’est que l’objetInScope est envoyé dans l’appel au gestionnaire ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X