J'ai un tableau de formulaires dans un formbuilder et je change dynamiquement les formulaires, c'est-à-dire en cliquant sur les données de chargement de l'application 1, etc.
Le problème que je rencontre est que toutes les données se chargent mais que les données du formarray restent et concatent simplement les anciens éléments avec les nouveaux.
Comment effacer ce formulaire pour n'avoir que les nouveaux éléments.
J'ai essayé ça
const control2 = <FormArray>this.registerForm.controls['other_Partners'];
control2.setValue([]);
mais ça ne marche pas.
Des idées? Merci
dans nginit
ngOnInit(): void {
this.route.params.subscribe(params => { alert(params['id']);
if (params['id']) {
this.id = Number.parseInt(params['id']);
}
else { this.id = null;}
});
if (this.id != null && this.id != NaN) {
alert(this.id);
this.editApplication();
this.getApplication(this.id);
}
else
{
this.newApplication();
}
}
onSelect(Editedapplication: Application) {
this.router.navigate(['/apply', Editedapplication.id]);
}
editApplication() {
this.registerForm = this.formBuilder.group({
id: null,
type_of_proposal: ['', Validators.required],
title: ['', [Validators.required, Validators.minLength(5)]],
lead_teaching_fellow: ['', [Validators.required, Validators.minLength(5)]],
description: ['', [Validators.required, Validators.minLength(5)]],
status: '',
userID: JSON.parse(localStorage.getItem('currentUser')).username,
contactEmail: JSON.parse(localStorage.getItem('currentUser')).email,
forename: JSON.parse(localStorage.getItem('currentUser')).firstname,
surname: JSON.parse(localStorage.getItem('currentUser')).surname,
line_manager_discussion: true,
document_url: '',
keywords: ['', [Validators.required, Validators.minLength(5)]],
financial_Details: this.formBuilder.group({
id: null,
buying_expertise_description: ['', [Validators.required, Validators.minLength(2)]],
buying_expertise_cost: ['', [Validators.required]],
buying_out_teaching_fellow_cost: ['', [Validators.required]],
buying_out_teaching_fellow_desc: ['', [Validators.required, Validators.minLength(2)]],
travel_desc: ['', [Validators.required, Validators.minLength(2)]],
travel_cost: ['', [Validators.required]],
conference_details_desc: ['', [Validators.required, Validators.minLength(2)]],
conference_details_cost: ['', [Validators.required]],
}),
partners: this.formBuilder.array
(
[
//this.initEditPartner(),
//this.initEditPartner()
// this.initMultiplePartners(1)
]
),
other_Partners: this.formBuilder.array([
//this.initEditOther_Partners(),
])
});
}
getApplication(id)
{
this.applicationService.getAppById(id, JSON.parse(localStorage.getItem('currentUser')).username)
.subscribe(Response => {
if (Response.json() == false) {
this.router.navigateByUrl('/');
}
else {
this.application = Response.json();
for (var i = 0; i < this.application.partners.length;i++)
{
this.addPartner();
}
for (var i = 0; i < this.application.other_Partners.length; i++) {
this.addOther_Partner();
}
this.getDisabledStatus(Response.json().status);
(<FormGroup>this.registerForm)
.setValue(Response.json(), { onlySelf: true });
}
}
);
}
ngonitit n'est pas appelé au clic
angular
angular2-forms
Karl O'Connor
la source
la source
Réponses:
J'ai eu le même problème. Il existe deux façons de résoudre ce problème.
Préserver l'abonnement
Vous pouvez effacer manuellement chaque élément FormArray en appelant la
removeAt(i)
fonction dans une boucle.Consultez la documentation FormArray pour plus d'informations.
Méthode plus propre (mais rompt les références d'abonnement)
Vous pouvez remplacer tout FormArray par un nouveau.
la source
formArray.clear();
Ou vous pouvez simplement effacer les commandes
Ajoute quelque chose
array
Effacer le tableau
Lorsque plusieurs choix sont sélectionnés et désactivés, parfois cela ne met pas à jour la vue. Une solution de contournement consiste à ajouter
MISE À JOUR
Une solution plus élégante pour utiliser des tableaux de formulaires consiste à utiliser un getter en haut de votre classe, puis vous pouvez y accéder.
Et de l'utiliser dans un modèle
Réinitialiser:
Pousser:
Supprimer la valeur à l'index: 1
MISE À JOUR 2:
Obtenez un objet partiel, obtenez toutes les erreurs en JSON et de nombreuses autres fonctionnalités, utilisez le NaoFormsModule
la source
inFormArray.at(1).remove();
me donne une[ts] Property 'remove' does not exist on type 'AbstractControl'.
erreur de transpilateur.let c of inFormArray
devrait êtrelet c of inFormArray.controls
?À partir d'Angular 8+, vous pouvez utiliser
clear()
pour supprimer tous les contrôles dans FormArray:Pour les versions précédentes, la méthode recommandée est:
https://angular.io/api/forms/FormArray#clear
la source
Angulaire 8
utilisez simplement la
clear()
méthode sur formArrays:la source
Angular v4.4 si vous devez enregistrer la même référence à l'instance de FormArray, essayez ceci:
la source
Attention!
La documentation Angular v6.1.7 FormArray dit:
Gardez cela à l'esprit si vous utilisez la
splice
fonction directement sur lecontrols
tableau comme l'une des réponses suggérées.Utilisez la
removeAt
fonction.la source
Vous pouvez facilement définir un getter pour votre tableau et l'effacer comme suit:
la source
Mise à jour: Angular 8 a enfin obtenu une méthode pour effacer le tableau FormArray.clear ()
la source
Depuis Angular 8, vous pouvez utiliser
this.formArray.clear()
pour effacer toutes les valeurs du tableau de formulaire. C'est une alternative plus simple et plus efficace pour supprimer tous les éléments un par unla source
Utilisez FormArray.clear () pour supprimer tous les éléments d'un tableau dans un FormArray
la source
Fourni la structure de données pour ce que vous allez remplacer les informations dans le tableau par correspond à ce qui est déjà là, vous pouvez utiliser
patchValue
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html#!#reset-anchor
Vous pouvez également utiliser
reset
Voici une démo de Plunker fourchue à partir de certains travaux antérieurs de la mine montrant une utilisation très simple de chacun.
la source
Je n'ai jamais essayé d'utiliser formArray, j'ai toujours travaillé avec FormGroup et vous pouvez supprimer tous les contrôles en utilisant:
étant formGroup une instance de FormGroup.
la source
Je suis très en retard mais j'ai trouvé un autre moyen de ne pas avoir de boucles. vous pouvez réinitialiser le tableau en définissant le contrôle du tableau sur vide.
Le code ci-dessous réinitialisera votre tableau.
this.form.setControl('name', this.fb.array([]))
la source
La boucle While prendra beaucoup de temps pour supprimer tous les éléments si le tableau contient des centaines d'éléments. Vous pouvez vider les contrôles et les propriétés de valeur de FormArray comme ci-dessous.
clearFormArray = (formArray: FormArray) => {formArray.controls = []; formArray.setValue ([]); }
la source
Pour garder le code propre, j'ai créé la méthode d'extension suivante pour toute personne utilisant Angular 7 et ci-dessous. Cela peut également être utilisé pour étendre toute autre fonctionnalité de Reactive Forms.
la source