Ich habe ein Formulararray in einem Formbuilder und ändere Formulare dynamisch, dh beim Klicken Daten aus Anwendung 1 laden usw.
Das Problem, das ich habe, ist, dass alle Daten geladen werden, aber die Daten im Formulararray bleiben und nur die alten Elemente mit neuen verknüpfen.
Wie lösche ich dieses Formular, um nur die neuen Elemente zu haben?
Ich habe es versucht
const control2 = <FormArray>this.registerForm.controls['other_Partners'];
control2.setValue([]);
aber es funktioniert nicht.
Irgendwelche Ideen? Vielen Dank
in 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 wird beim Klicken nicht aufgerufen
angular
angular2-forms
Karl O'Connor
quelle
quelle
Antworten:
Ich hatte das gleiche Problem. Es gibt zwei Möglichkeiten, um dieses Problem zu lösen.
Abonnement beibehalten
Sie können jedes FormArray-Element manuell löschen, indem Sie die
removeAt(i)
Funktion in einer Schleife aufrufen .Weitere Informationen finden Sie in der FormArray-Dokumentation .
Sauberere Methode (bricht jedoch Abonnementreferenzen)
Sie können das gesamte FormArray durch ein neues ersetzen.
quelle
formArray.clear();
Oder Sie können einfach die Steuerelemente löschen
Füge etwas hinzu
array
Löschen Sie das Array
Wenn Sie mehrere Auswahlmöglichkeiten ausgewählt und gelöscht haben, wird die Ansicht manchmal nicht aktualisiert. Eine Problemumgehung ist das Hinzufügen
AKTUALISIEREN
Eine elegantere Lösung für die Verwendung von Formulararrays ist die Verwendung eines Getters an der Spitze Ihrer Klasse, auf den Sie zugreifen können.
Und um es in einer Vorlage zu verwenden
Zurücksetzen:
Drücken:
Wert am Index entfernen: 1
UPDATE 2:
Teilobjekt abrufen , alle Fehler als JSON abrufen und viele andere Funktionen verwenden, das NaoFormsModule verwenden
quelle
inFormArray.at(1).remove();
gibt mir einen[ts] Property 'remove' does not exist on type 'AbstractControl'.
Transpilerfehler.let c of inFormArray
sollte seinlet c of inFormArray.controls
?Ab Angular 8+ können Sie
clear()
alle Steuerelemente im FormArray entfernen:Für frühere Versionen wird empfohlen:
https://angular.io/api/forms/FormArray#clear
quelle
Winkel 8
Verwenden Sie einfach die
clear()
Methode für formArrays:quelle
Angular v4.4 Wenn Sie denselben Verweis auf die Instanz von FormArray speichern müssen, versuchen Sie Folgendes:
quelle
Warnung!
In der AngAr v6.1.7 FormArray-Dokumentation heißt es:
Denken Sie daran, wenn Sie die
splice
Funktion direkt auf demcontrols
Array als eine der vorgeschlagenen Antworten verwenden.Verwenden Sie die
removeAt
Funktion.quelle
Sie können einen Getter für Ihr Array einfach definieren und wie folgt löschen:
quelle
Update: Angular 8 hat endlich die Methode zum Löschen des Arrays FormArray.clear () erhalten
quelle
Seit Angular 8 können Sie
this.formArray.clear()
alle Werte im Formulararray löschen. Dies ist eine einfachere und effizientere Alternative zum Entfernen aller Elemente nacheinanderquelle
Verwenden Sie FormArray.clear (), um alle Elemente eines Arrays in einem FormArray zu entfernen
quelle
Die Datenstruktur für das, was Sie ersetzen möchten, wird durch Übereinstimmungen mit den bereits vorhandenen Daten bereitgestellt
patchValue
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html#!#reset-anchor
Alternativ könnten Sie verwenden
reset
Hier ist eine gegabelte Plunker-Demo aus einer früheren Arbeit von mir, die eine sehr einfache Verwendung von jedem zeigt.
quelle
Ich habe nie versucht, formArray zu verwenden, ich habe immer mit FormGroup gearbeitet, und Sie können alle Steuerelemente entfernen mit:
FormGroup ist eine Instanz von FormGroup.
quelle
Ich bin sehr spät dran, aber ich habe einen anderen Weg gefunden, auf dem Sie keine Schleifen benötigen. Sie können das Array zurücksetzen, indem Sie das Array-Steuerelement auf leer setzen.
Der folgende Code setzt Ihr Array zurück.
this.form.setControl('name', this.fb.array([]))
quelle
Die while-Schleife benötigt lange, um alle Elemente zu löschen, wenn das Array 100 Elemente enthält. Sie können die Steuerelemente und Werteigenschaften von FormArray wie unten beschrieben leeren.
clearFormArray = (formArray: FormArray) => {formArray.controls = []; formArray.setValue ([]); }}
quelle
Um den Code sauber zu halten, habe ich die folgende Erweiterungsmethode für alle Benutzer von Angular 7 und darunter erstellt. Dies kann auch verwendet werden, um andere Funktionen von Reactive Forms zu erweitern.
quelle