Est-il possible de créer un validateur qui peut utiliser plusieurs valeurs pour décider si mon champ est valide?
Par exemple, si la méthode de contact préférée du client est par e-mail, le champ e-mail doit être obligatoire.
Merci.
Mis à jour avec un exemple de code ...
import {Component, View} from 'angular2/angular2';
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
@Component({
selector: 'customer-basic',
viewInjector: [FormBuilder]
})
@View({
templateUrl: 'app/components/customerBasic/customerBasic.html',
directives: [formDirectives]
})
export class CustomerBasic {
customerForm: ControlGroup;
constructor(builder: FormBuilder) {
this.customerForm = builder.group({
firstname: [''],
lastname: [''],
validateZip: ['yes'],
zipcode: ['', this.zipCodeValidator]
// I only want to validate using the function below if the validateZip control is set to 'yes'
});
}
zipCodeValidator(control) {
if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
return { invalidZipCode: true };
}
}
}
equal
, desequalTo
méthodes et une bonne documentation!Réponses:
Pour répéter les méthodes que d'autres ont publiées, c'est ainsi que j'ai créé
FormGroup
validateurs qui n'impliquent pas plusieurs groupes.Pour cet exemple, fournissez simplement les noms de clé des champs
password
etconfirmPassword
.Pour
Validators
prendre des paramètres, ils doivent renvoyer afunction
avec aFormGroup
ouFormControl
comme paramètre. Dans ce cas, je valide un fichierFormGroup
.Techniquement, j'aurais pu valider deux valeurs si je connaissais leurs clés, mais je préfère nommer mon
Validators
la même manière que l'erreur qu'elles renverront. La fonction peut être modifiée pour prendre un troisième paramètre qui représente le nom de clé de l'erreur renvoyée.Mise à jour le 6 décembre 2016 (v2.2.4)
Exemple complet: https://embed.plnkr.co/ukwCXm/
la source
FormGroup
pour gérer la validation multi-champs au lieu de mettre unValidator
sur le tout.[{validator: matchingPasswords('password', 'confirmPassword')},{validator: matchingEmail('email', 'confirmemail')}]
J'ai essayé cela mais cela ne fonctionne pas. Aucune suggestion ? @DaveLa réponse de Dave a été très, très utile. Cependant, une légère modification pourrait aider certaines personnes.
Au cas où vous auriez besoin d'ajouter des erreurs dans les
Control
champs, vous pouvez conserver la construction réelle du formulaire et des validateurs:Au lieu de définir une erreur sur le
ControlGroup
, faites-le sur le champ réel comme suit:la source
passwordConfirmationInput.setErrors(passwordConfirmationInput.validator(passwordConfirmationInput))
dans laelse
branche pour la mettre à jour correctement lorsqu'une modification depasswordInput
rend les données valides.TypeError: passwordConfirmationInput.validator is not a function
. C'est parce que je n'ai pas créé explicitement le FormControl avec Validators.required. J'ai laissé les validateurs vides et utilisé à la place l'attribut "requis" sur l'entrée.{[key: string]: any}
, quisetErrors(...)
ne retourne pas (plus?).setErrors(...)
Ecrase également toutes les erreurs déjà présentes, j'ai donc ajouté à l'objet d'erreur actuel comme:let errors = formGroup.controls[passwordConfirmationKey].errors;
andif(!errors) errors={};
anderrors['notEquivalent'] = true;
andformGroup.controls[dateControlFirst].setErrors(errors);
Lors de l'implémentation de validateurs pour plusieurs champs de formulaire, vous devrez vous assurer que les validateurs sont réévalués lorsque chacun des contrôles de formulaire est mis à jour. La plupart des exemples ne fournissent pas de solution pour un tel scénario, mais cela est très important pour la cohérence des données et un comportement correct.
Veuillez consulter mon implémentation d'un validateur personnalisé pour Angular 2, qui en tient compte: https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30 .
J'utilise
otherControl.valueChanges.subscribe()
pour écouter les changements dans un autre contrôle etthisControl.updateValueAndValidity()
pour déclencher un autre cycle de validation lorsque l'autre contrôle est modifié.Je copie un code ci-dessous pour référence future:
match-other-validator.ts
Usage
Voici comment vous pouvez l'utiliser avec des formulaires réactifs:
Des validateurs plus à jour peuvent être trouvés ici: moebius-mlm / ng-validators .
la source
this
pour? En fait, il est bon d'avoir une fonction nommée à des fins de débogage.othercontrol.valuechanges.subscribe
ne s'est désabonné nulle part.valueChanges
observable lorsque celui-otherControl
ci sera détruit, ce qui entraînera également la résiliation de l'abonnement. Cependant, vos préoccupations pourraient être valables. Je suggérerais de déboguer complètement ce code avec la dernière version d'Angular en utilisant divers cas de test. S'il vous plaît, faites un rapport si vous trouvez des problèmes.J'utilise Angular 2 RC.5 mais je n'ai pas trouvé le ControlGroup, basé sur la réponse utile de Dave. J'ai trouvé que FormGroup fonctionne à la place. J'ai donc fait quelques mises à jour mineures sur les codes de Dave et j'ai pensé partager avec d'autres.
Dans votre fichier de composant, ajoutez une importation pour FormGroup:
Définissez vos entrées au cas où vous auriez besoin d'accéder directement au contrôle de formulaire:
Dans votre constructeur, instanciez votre formulaire:
Ajoutez la fonction matchingPasswords dans votre classe:
J'espère que cela aidera ceux qui utilisent RC.5. Notez que je n'ai pas encore testé sur RC.6.
la source
if (passwordInput.value !== passwordConfirmationInput.value) { return passwordConfirmationInput.setErrors({ notEquivalent: true }); } else { return passwordConfirmationInput.setErrors(null); }
Beaucoup de creuser dans la source angulaire mais j'ai trouvé un meilleur moyen.
Partie HTML pour le groupe de mots de passe
la source
Pour développer la réponse de matthewdaniel car ce n'est pas tout à fait correct. Voici un exemple de code qui montre comment attribuer correctement un validateur à un fichier
ControlGroup
.Voici un exemple fonctionnel: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
la source
ControlGroup
est supprimé au profit deFormGroup
pour quiconque regarde cela. Exemple Docs and Learn Angular2Voici une autre option que j'ai pu proposer qui ne dépend pas d'un sous-ensemble ou d'un sous-marin
ControlGroup
mais est directement liée à chacunControl
.Le problème que j'avais était que les contrôles qui dépendaient les uns des autres n'étaient pas hiérarchiquement ensemble, donc je n'ai pas pu créer un fichier
ControlGroup
. De plus, mon CSS a été configuré pour que chaque contrôle exploite les classes angulaires existantes pour déterminer s'il faut afficher le style d'erreur, ce qui était plus compliqué lorsqu'il s'agissait d'une validation de groupe au lieu d'une validation spécifique au contrôle. Essayer de déterminer si un seul contrôle était valide n'était pas possible puisque la validation était liée au groupe de contrôles et non à chaque contrôle individuel.Dans mon cas, je voulais la valeur d'une boîte de sélection pour déterminer si un autre champ serait requis ou non.
Ceci est construit à l'aide du générateur de formulaires sur le composant. Pour le modèle de sélection au lieu de le lier directement à la valeur de l'objet de requête, je l'ai lié pour obtenir / définir des fonctions qui me permettront de gérer les événements "sur modification" pour le contrôle. Ensuite, je pourrai définir manuellement la validation d'un autre contrôle en fonction de la nouvelle valeur des contrôles de sélection.
Voici la partie de la vue pertinente:
La partie composante pertinente:
Dans mon cas, j'ai toujours eu une validation de modèle liée au contrôle, donc le
validator
est toujours défini sur quelque chose, mais je pense que vous pouvez définir levalidator
sur null si vous n'avez aucune validation liée au contrôle.MISE À JOUR: Il existe d'autres méthodes pour capturer le changement de modèle comme
(ngModelChange)=changeFunctionName($event)
ou souscrire pour contrôler les changements de valeur en utilisantthis.form.controls["employee"].valueChanges.subscribe(data => ...))
la source
J'ai essayé la plupart de ces réponses, mais aucune n'a fonctionné pour moi. J'ai trouvé un exemple de travail ici https://scotch.io/@ibrahimalsurkhi/match-password-validation-with-angular-2
la source
Je cherchais également cela et a fini par utiliser le
equalTo
package ng2-validation ( https://www.npmjs.com/package/ng2-validation )Voici un exemple: Piloté par un modèle:
Modèle conduit:
Modèle:
la source
Voici ma version que j'ai utilisée pour m'assurer qu'un âge dans un domaine est supérieur ou égal à l'âge dans un autre domaine. J'utilise également des groupes de formulaires, donc j'utilise la
group.get
fonction plutôt quegroup.controls[]
Et dans le composant:
la source
Je pense que votre meilleur pari, pour l'instant, est de créer un groupe de formulaires pour tenir vos commandes. Lorsque vous instanciez votre passe de contrôle dans la fonction pour la valider. exemple:
Je sais que cela dépend fortement de la version d'angularjs2 que vous utilisez. Cela a été testé contre 2.0.0-alpha.46
Si quelqu'un a une meilleure suggestion telle que l'écriture d'un validateur personnalisé (ce qui peut être la meilleure façon de procéder), c'est le bienvenu.
ÉDITER
vous pouvez également utiliser ControlGroup et valider ce groupe dans son intégralité.
Modifiez simplement les messages en fonction de votre domaine.
la source
La réponse de Louis Cruz m'a été très utile.
Pour terminer, ajoutez simplement dans le else la réinitialisation de setErrors: return passwordConfirmationInput.setErrors (null);
Et tout fonctionne bien!
Merci,
Cordialement,
TGA
la source
Angular 8 Exemple de validation sur le champ de confirmation du mot de passe
FYI: cela ne mettra pas à jour la validation sur le champ passwordConfirm si le champ principal "mot de passe" est changé après que cette validation soit passée. Mais, vous pouvez invalider le champ de confirmation du mot de passe lorsqu'un utilisateur tape dans le champ du mot de passe
register.component.ts
password-confirm-validator.ts
register.component.html
la source
Je suggérerais d'utiliser la bibliothèque
ng-form-rules
. C'est une bibliothèque géniale pour créer tous les types de formulaires avec une logique de validation découplée du composant et qui peut dépendre des changements de valeur d'autres zones du formulaire. Ils ont une excellente documentation , des exemples et une vidéo qui montre un tas de ses fonctionnalités . Faire une validation comme celle-ci, ce que vous essayez de faire est trivial.Vous pouvez consulter leur README pour des informations de haut niveau et un exemple de base.
la source
Règles de validation de correspondance de mot de passe angulaire 4.
Si vous avez besoin de champs de contrôle des erreurs, vous pouvez le faire.
Ensuite, vous devez déclarer cette méthode dans la
constructor
méthode Like as.Au lieu de définir une erreur sur le ControlGroup, procédez comme suit sur le champ réel:
Partie HTML pour le groupe de mots de passe
la source