3
votes

Comment réinitialiser l'erreur de validation sans réinitialiser le formulaire en angulaire?

J'ai une forme orientée modèle angulaire. et je veux réinitialiser toutes les erreurs de validation et les rendre intactes sans réinitialiser le formulaire. Comment faire ça en angulaire? J'ai essayé la méthode suivante

onAdd(form: NgForm) {

form.form.markAsPristine();
form.form.markAsUntouched();

}

mais cela ne fonctionne pas.

lien: - https://stackblitz.com/edit/angular-ezixd4

comportement actuel: - lorsque je clique pour soumettre un formulaire vide, tout le champ est marqué avec une erreur et lorsque je clique sur add il ajoute le champ mais la fonction ci-dessus ne supprime pas le message d'erreur.

comportement attendu: - lorsque je clique pour soumettre un formulaire vide, tout le champ est marqué avec une erreur et lorsque je clique sur add il ajoute le champ et il doit supprimer le message d'erreur sur le formulaire (ou dans les fichiers ajoutés).

Dans ce formulaire, j'ajoute un champ de saisie avec le bouton d'ajout et je souhaite effacer tout message d'erreur avant que l'utilisateur n'ait la possibilité d'interagir avec le formulaire.


9 commentaires

Essayez ceci avec @ViewChild() et vous trouverez plus d'informations sur le lien donné


Donc, si votre formulaire n'est pas valide (en raison de valeurs non valides dans les contrôles) et que vous le rendez vierge mais que vous ne supprimez pas les valeurs non valides, votre formulaire ne sera-t-il toujours pas invalide.


J'ai essayé @ViewChild() mais cela ne fonctionne toujours pas.


@xyz oui mais c'est pourquoi je veux le rendre intact, et si l'utilisateur clique à nouveau avec la valeur invalide, l'erreur réapparaîtra.


La vraie raison pour laquelle je veux avoir ce comportement parce que add button champ de saisie dynamiquement par le add button puisque le champ de saisie nouvellement ajouté sera vide, alors il affiche une erreur avant que l'utilisateur n'ait une chance d'interagir avec lui.


@rahulKushwaha donc, cela devrait fonctionner. Veuillez montrer comment vous ajoutez un nouveau champ de saisie.


Votre code fonctionne parfaitement, il suffit de l'essayer. Veuillez créer un stackblitz présentant le problème.


@ AJT_82 là vous allez, j'ai ajouté stackblitz.


Yaah, le code est un peu différent de ce que vous avez montré, ou dirons-nous qu'il n'était pas complet avant. Maintenant, je vois le problème. Je vais voir si je peux trouver quelque chose, vous faire savoir si je le fais :) Je pense que j'ai déjà vu ça, mais je vais quand même vérifier si j'ai raison.


7 Réponses :


2
votes

Vous pouvez simplement parcourir chaque champ requis et appeler leur méthode setErrors tout en leur passant null :

this.loginForm.controls.username.setErrors(null);
this.loginForm.controls.password.setErrors(null);

par exemple lorsque vous avez un champ username et password :

YOUR_FORM.controls.YOUR_FIELD_NAME.setErrors(null);

J'espère que cela t'aides!


3 commentaires

Je crois qu'il n'affiche que des erreurs et empêche l'envoi du formulaire si le formulaire est touché. S'il marque la forme comme vierge et intacte, sa logique devrait réellement fonctionner.


merci pour votre réponse, mais cela supprime complètement l'erreur, je veux que l'erreur réapparaisse si l'utilisateur n'interagit toujours pas avec le formulaire, mais de l'approche ci-dessus, il supprime complètement l'erreur et permet au formulaire de se soumettre.


Votre formulaire peut-il vraiment être soumis après avoir supprimé toutes les erreurs? Avec mon formulaire, une erreur réapparaît lorsque je soumets à nouveau mon formulaire car dans mon auditeur d'envoi, il est vérifié si la propriété de formulaire invalide est vraie ou fausse. La validation de formulaire et les valeurs de champ ne sont en fait pas supprimées mais uniquement les messages d'erreur.



3
votes

la classe mat-input-invalid dépend en partie de l'état submitted du formulaire. Ainsi, lorsque vous soumettez le formulaire, la propriété submitted devient true. markAsPristine() ou markAsUntouched() ne réinitialise pas l'indicateur submitted , ainsi les erreurs markAsUntouched() toujours. Je vois deux possibilités. Un rapide et sale, qui lorsque je l'ai testé semble fonctionner dans votre cas. Je ne peux pas promettre que cela fonctionnera dans tous les cas, mais vous pouvez expérimenter avec et voir si cela fonctionnera. C'est, vous appelez resetForm() qui ne réinitialise la submitted propriété. Mais oui, vous souhaitez conserver les valeurs qui sont définies .. donc, nous passons la valeur de l'état actuel du formulaire dans la réinitialisation:

onAdd(form: NgForm) {
  this.specification.push(++this.num);
  form.resetForm(form.value);  
}

DEMO

C'était donc la manière sale, une manière plus contrôlée serait d'utiliser ErrorStateMatcher , qui est également mentionné dans la documentation . Avec cela, vous pouvez choisir quand afficher les messages d'erreur.


1 commentaires

oui, cela a du sens, je veux en fait supprimer l'erreur du champ nouvellement ajouté avant que l'utilisateur n'ait une chance d'interagir avec lui.



1
votes

Assurez-vous qu'il n'y a pas de bouton dans la section du formulaire. Addnew bouton Addnew doit être hors de la forme.


1 commentaires

Veuillez revoir cette réponse pour qu'elle soit en anglais.



0
votes

Vous pouvez le faire d'une manière plus générique:

reset(formGroup: FormGroup) {
   Object.keys(formGroup.controls).forEach(
      field => {
         formGroup.get(field).setErrors(null);
      }
    );
}
...
this.reset(yourForm);
...


0 commentaires

1
votes
 resetForm() {
    this.myFormGroup.reset();
    this.myFormGroup.setErrors(null); // could be removed
    this.myFormGroup.updateValueAndValidity();
  } 

0 commentaires

0
votes

Cela a finalement fonctionné pour moi:

this.form.reset();
Object.keys(this.form.controls).forEach(key => {
    this.form.get(key).setErrors(null) ;
});


0 commentaires

0
votes

Je devais faire cela, mettre un délai d'attente pour que l'événement de flou avant de cliquer sur un bouton ne soit pas géré après le clic sur le bouton d'annulation:

let timeout = setTimeout(function() {
  Object.keys(originalValues).forEach(controlName => {
    let control =that.getControl(controlName);
    control.setValue(originalValues[controlName]);
    control.markAsUntouched();
    control.setErrors(null);
    control.markAsPristine();
  });
  this.setControlState(formName);
  clearTimeout(timeout);
}, 10);


0 commentaires