mot de passe-vérifier la directive en angularjs
Je suis en train d'écrire un mot de passe de vérifier la directive :
Directives.directive("passwordVerify",function(){
return {
require:"ngModel",
link: function(scope,element,attrs,ctrl){
ctrl.$parsers.unshift(function(viewValue){
var origin = scope.$eval(attrs["passwordVerify"]);
if(origin!==viewValue){
ctrl.$setValidity("passwordVerify",false);
return undefined;
}else{
ctrl.$setValidity("passwordVerify",true);
return viewValue;
}
});
}
};
});
html :
<input data-ng-model='user.password' type="password" name='password' placeholder='password' required>
<input data-ng-model='user.password_verify' type="password" name='confirm_password' placeholder='confirm password' required data-password-verify="user.password">
2 champs de mot de passe dans un formulaire, si les deux valeurs de mot de passe sont égaux, alors le champ concernés par la directive est valable.
Le problème est qu'il fonctionne dans un seul sens (c'est à dire que quand je tape un mot de passe le mot de passe de vérifier les champs). Toutefois, lorsque le champ mot de passe est mis à jour, le mot de passe de vérifier n'est pas valide.
Aucune idée de comment je pourrait avoir une "liaison bidirectionnelle vérifier?"
Vous devez vous connecter pour publier un commentaire.
Cela devrait résoudre:
Vue:
Directive
Je utilisez la directive suivante parce que je veux re-valider à la fois champ de saisie indépendamment du fait que la valeur 1 ou la valeur 2 a été modifié:
directive:
utilisation
ng-minlength
sur le premier champ, alors que le modèle n'est pas défini jusqu'à ce qu'il est en fait valablengModel.$setValidity
avecif (val1 && val2) { .. }
seulement si le formulaire n'est pas valide lorsque les deux valeurs sont vides.[form name].[field name].$error.equals
L'utiliser pour contrôler ce champs doit ou devrait montrer. Je l'utilise pour l'erreur étiquettes.ngModel.$setValidity('equals', val1 === val2);
avecngModel.$setValidity('equals', ! val1 || ! val2 || val1 === val2);
La création d'une directive distincte, ce n'est pas nécessaire. Il y a déjà un construire Angulaire de l'INTERFACE utilisateur mot de passe outil de validation. Avec ce que vous pouvez faire:
confirm_password
est également invalidée sipassword
a des critères de validation sont pas remplies.Encore une autre c'est de faire correspondre le modèle d'une entrée à une autre entrée de la valeur.
Donc, si le mot de passe de la boîte modèle est
login.password
puis vous définissez l'attribut suivant sur la vérification de la boîte:nx-equal="login.password"
, et l'essai pourformName.elemName.$error.nxEqual
. Comme:Version étendue:
Pour un nouveau projet de la mine, j'ai dû modifier la directive ci-dessus, de sorte qu'il ne serait d'afficher le
nxEqual
erreur si, et seulement si, la vérification de l'entrée a une valeur. Sinon, lenxEqual
erreur doit être mis en sourdine. Voici la version longue:Et vous pouvez l'utiliser comme ceci:
Essayer: http://jsfiddle.net/gUSZS/
false
, donc en ne spécifiant pas explicitement une portée, il est égal àscope: false
.false
par défaut, avoir un coup d'oeil à AngularJS compile.js où il est dit: “Si la valeurtrue
, ensuite, un nouveau champ d'application sera créé par la présente directive.” ou ng-newsletter.com l’article de “Construire des directives sur mesure avec AngularJS”, qui indique: “Il peut être défini à true (c'est à false par défaut).”$eval
et ne lie pas l'option comme=
?=
ne réexaminera pas la première fois qu'il a été rempli. J'ai fait une rapide JSFiddle qui affiche ce problème.Je l'ai fait sans directive.
https://github.com/wongatech/angular-confirm-field est un bon projet pour ce.
Exemple ici http://wongatech.github.io/angular-confirm-field/
Le code ci-dessous montre les 2 champs de saisie avec la mise en œuvre de la fonctionnalité
Comme angulaire 1.3.0-beta12, non valide les intrants de ne pas écrire sur ngModel, de sorte que vous ne pouvez pas le regarder, PUIS à valider comme vous pouvez le voir ici: http://plnkr.co/edit/W6AFHF308nyKVMQ9vomw?p=preview. Une nouvelle validateurs pipeline a été introduit et que vous pouvez joindre à cette fonction pour obtenir la même chose.
En fait, sur cette note, j'ai créé une charmille composant pour la commune supplémentaire validateurs: https://github.com/intellix/angular-validators qui comprend cette.
J'ai utilisé cette directive avec succès avant:
Utilisation
J'avais le même problème et trouvé une bonne post de blog sujet écrit par Piotr Buda. C'est une bonne lecture, et il explique le processus très bien. Le code est comme suit:
De sorte que vous pourriez faire quelque chose comme:
De crédit va à l'auteur
N'est-ce pas assez bon:
Simple, et fonctionne très bien pour moi.
Cette solution est similaire à celui donné par Dominic Watson, qui utilise $validators et c'est celle que j'aime le mieux. Les seules différences sont que vous pouvez regarder une expression.
de https://code.angularjs.org/1.3.15/docs/api/ng/type/ngModel.NgModelController
Je suis en utilisant angulaire 1.3. Mon directive ressemble à quelque chose comme ceci
Utiliser
Pour la validation de formulaire avec deux champ de saisie,j'ai trouver la façon la plus appropriée de
Directive
HTML
Cela fonctionne dans les deux sens et il est simple et propre
JavaScript
HTML: a noter le match de la directive
Vous pouvez cloner le repo avec cet exemple
https://github.com/rogithub/roangularjs
Pas une directive solution, mais travaille pour moi:
Et dans le contrôleur:
http://plnkr.co/edit/QDTnipCsHdg56vgygsqC?p=preview
Ce qui suit est mon point de vue sur le problème. Cette directive s'comparer à une forme de la valeur plutôt que de la portée.
dans le code HTML on fait maintenant référence à la forme plutôt que de l'étendue valeur:
$scope.$watch(form[attrs.equals], validate);
est jamais appelé. Sinon, il suffirait d'avoir de l'equals
attribut sur un seul élément.Afin d'obtenir la validation lorsque les deux entrées de changement, j'utilise le code suivant (qui a été une combinaison de toutes les autres, d'autres réponses):
Tout d'abord, je tiens à remercier Fredric pour l'affichage de cet excellent exemple. Il y a un petit problème que j'ai rencontré par hasard. sur le Violon que vous avez posté http://jsfiddle.net/gUSZS/
Si vous tapez un mot de passe, puis tapez le même mot de passe dans le fait de vérifier l'élément d'entrée tout fonctionne bien, mais essayez d'ajouter un espace à la deuxième case et angulaire va automatiquement ajuster l'espace. Cela signifie que la directive ne marche pas "voir" l'espace supplémentaire. Maintenant, les mots de passe sont différents, mais la forme est toujours valide.
pour corriger cela, nous devons ajouter
les éléments d'entrée. Cela ne fonctionne pas dans angulaire 1.0.3 donc, si vous voulez l'essayer dans ce violon vous devez ajouter 1.1.1 pour le Violon (http://ajax.googleapis.com/ajax/libs/angularjs/1.1.1/angular.js)
Mais encore une fois, merci Frédéric, je vais utiliser votre solution dans mon application!
Anton
P. S. je souhaite faire un commentaire sur Frédéric post, mais je suis nouveau sur ce forum et ne semble pas avoir suffisamment de crédit. Donc, il serait très apprécié si certains d'entre vous peut voter mon commentaire si vous le souhaitez 🙂
Pas besoin d'un supplément de la directive, voici mon point de vue sur ce:
HTML:
Javascript:
où Regex.escape() peut être trouvé ici.
Fonctionne comme un charme!
Pour ajouter le grand nombre de solutions existantes, ce qui fonctionne bien pour moi.
(Jan Laussmann réponse cessé de travailler avec la dernière AngularJS versions bêta).
directive:
utilisation
erreur d'affichage de la
Cela a fonctionné pour moi.
Directive:
HTML:
J'ai eu le même problème quand j'ai essayé de construire mon propre directive, et je fixe avec cet add
où la touche ctrl est mon ngModelController
c'est mon point de vue
c'est mon directive
Quelque chose comme cela fonctionne pour moi:
js:
html:
Le Garder Simple Et Stupide(KISS) principe pourrait être utile sur ce point. Son plus rapide et plus facile à vérifier si les deux mots de passe correspondent de la manière suivante:
Et Avant de soumettre le formulaire, vous pouvez le faire dans votre js
Vous pouvez le tester dans JSfiddle ainsi.