Angulaire Dynamiquement ajouter/supprimer des validateurs
J'ai un FormGroup
défini comme ci-dessous:
this.businessFormGroup: this.fb.group({
'businessType': ['', Validators.required],
'description': ['', Validators.compose([Validators.required, Validators.maxLength(200)])],
'income': ['']
})
Maintenant, quand businessType
est Other
, je veux supprimer Validators.required
validateur de description
. Et si businessType
n'est pas Other
, je veux ajouter le Validators.required
.
Je suis en utilisant le code ci-dessous pour ajouter dynamiquement/supprimer le Validators.required
. Cependant, il efface l'existant Validators.maxLength
validateur.
if(this.businessFormGroup.get('businessType').value !== 'Other'){
this.businessFormGroup.get('description').validator = <any>Validators.compose([Validators.required]);
} else {
this.businessFormGroup.get('description').clearValidators();
}
this.businessFormGroup.get('description').updateValueAndValidity();
Ma question est, comment puis-je conserver les validateurs lors de l'ajout/retrait de la required
validateur.
- les validateurs de stockage comme un tableau , vous aurez besoin de gérer la liste des validateurs appliqué par vous-même
- malheureusement, ce n'est pas possible, angulaire semble fusionner les appliquer validateurs en interne, par conséquent, vous pouvez uniquement appeler
clear
etset
fonctions - c'est faux, les validateurs sont composés en une seule fonction et c'est tout. Avec l'implémentation actuelle de l'API, il n'est pas possible de vérifier les validateurs sont définies pour un contrôle
Vous devez vous connecter pour publier un commentaire.
Des formes angulaires ont une fonction intégrée setValidators() qui permet programmatique cession de Validateurs.
Pour votre exemple que vous pouvez faire:
Il est important de garder à l'esprit que en utilisant cette méthode vous permettra de remplacer votre existant validateurs de sorte que vous aurez besoin d'inclure tous les validateurs vous avez besoin/envie pour le contrôle que vous réinitialisation.
Ce un travail pour moi
L'approche naïve serait de définir les validateurs du contrôle à chaque fois que la variable de condition changements. Mais nous pouvons faire mieux en utilisant une indirection + programmation fonctionnelle.
Tenir compte de l'existence d'un
descriptionIsRequired
de lecture, qui agit comme un boolan drapeau.Idées:
descriptionIsRequired
comme argument et selon qu'il valide un contrôle obligatoire + maxLength ou maxLength.descriptionIsRequired
doit être envisagée.Le premier point est assez simple à mettre en œuvre:
Avis que c'est une auto encapsulée fonction.
Le deuxième point est un peu plus délicat, mais à la fin il ressemble à ceci:
Une petite explication de ce qui se passe:
validator
méthode retourne une fonctionvalidator
pourrait être considéré comme un usine méthode: à chaque fois que son invoquée, renvoie une nouvelle fonction, plus précisément, une nouvelle instance de notredescriptionValidator
en utilisant le plus récentdescriptionIsRequired
valeur.Une démo en live dans la suite de stackblitz
V
qui doivent toujours être active dans un contrôle. D'où ils viennent n'est pas pertinent. Alors vous avez une autre collection de validateursVop
, dans ce cas, une collection avec seulement nécessaire en elle, qui peut et ne peut pas être actif dans un contrôle en fonction d'une condition booléenne. Suis-je le droit? Si non, veuillez expliquer plus en détail quel est votre concept de "générique" de la mise en œuvre.Peut-être que cela aide:
L'Ajout De Validateurs.nécessaire à la validatorset d'un
AbstractControl
:Quiconque cherche toujours une réponse, vous pouvez le faire comme ceci ,poignée en ngOnInit() ou n'importe quel endroit que vous aimez.
Suivre la samething pour asyncValidator ainsi.