Mam tablicę formularzy wewnątrz konstruktora formularzy i dynamicznie zmieniam formularze, tj. Ładowanie danych z aplikacji 1 po kliknięciu itp.
Problem, który mam, polega na tym, że wszystkie dane są ładowane, ale dane w formarray pozostają i po prostu łączą stare elementy z nowymi.
Jak wyczyścić tę tablicę, aby mieć tylko nowe elementy.
Próbowałem tego
const control2 = <FormArray>this.registerForm.controls['other_Partners'];
control2.setValue([]);
ale to nie działa.
Jakieś pomysły? dzięki
w 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 nie jest wywoływany po kliknięciu
angular
angular2-forms
Karl O'Connor
źródło
źródło
Odpowiedzi:
Miałem ten sam problem. Istnieją dwa sposoby rozwiązania tego problemu.
Zachowaj subskrypcję
Możesz ręcznie wyczyścić każdy element FormArray, wywołując
removeAt(i)
funkcję w pętli.Więcej informacji można znaleźć w dokumentacji FormArray .
Czystsza metoda (ale łamie odniesienia do subskrypcji)
Możesz zastąpić cały FormArray nowym.
źródło
formArray.clear();
Możesz też po prostu wyczyścić elementy sterujące
Dodać coś
array
Wyczyść tablicę
Gdy masz zaznaczonych i wyczyszczonych wiele opcji, czasami nie aktualizuje to widoku. Obejściem problemu jest dodanie
AKTUALIZACJA
Bardziej eleganckim rozwiązaniem do używania tablic formularzy jest użycie metody pobierającej na początku klasy, a następnie można uzyskać do niej dostęp.
I użyć go w szablonie
Resetowanie:
Pchać:
Usuń wartość w indeksie: 1
AKTUALIZACJA 2:
Pobierz częściowy obiekt, pobierz wszystkie błędy jako JSON i wiele innych funkcji, użyj NaoFormsModule
źródło
inFormArray.at(1).remove();
daje mi[ts] Property 'remove' does not exist on type 'AbstractControl'.
błąd transpilera.let c of inFormArray
powinno byćlet c of inFormArray.controls
?Od Angular 8+ możesz użyć
clear()
do usunięcia wszystkich kontrolek w FormArray:W przypadku poprzednich wersji zalecany sposób to:
https://angular.io/api/forms/FormArray#clear
źródło
Kątowy 8
po prostu użyj
clear()
metody na formArrays:źródło
Angular v4.4, jeśli chcesz zapisać to samo odniesienie do instancji FormArray, spróbuj tego:
źródło
Ostrzeżenie!
Dokumentacja Angular v6.1.7 FormArray mówi:
Pamiętaj o tym, jeśli używasz
splice
funkcji bezpośrednio nacontrols
tablicy jako jednej z sugerowanych odpowiedzi.Użyj
removeAt
funkcji.źródło
Możesz łatwo zdefiniować metodę pobierającą dla swojej tablicy i wyczyścić ją w następujący sposób:
źródło
Aktualizacja: Angular 8 w końcu uzyskał metodę czyszczenia Array FormArray.clear ()
źródło
Od Angular 8 możesz użyć
this.formArray.clear()
do wyczyszczenia wszystkich wartości z tablicy formularza. To prostsza i wydajniejsza alternatywa dla usuwania wszystkich elementów jeden po drugimźródło
Użyj FormArray.clear (), aby usunąć wszystkie elementy tablicy w FormArray
źródło
Pod warunkiem, że struktura danych zostanie zastąpiona informacjami w tablicy dopasowaniami, które już tam są, możesz użyć
patchValue
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html#!#reset-anchor
Alternatywnie możesz użyć
reset
Oto rozwidlone demo Plunkera z niektórych moich wcześniejszych prac demonstrujące bardzo proste wykorzystanie każdego z nich.
źródło
Nigdy nie próbowałem używać formArray, zawsze pracowałem z FormGroup i możesz usunąć wszystkie kontrolki za pomocą:
będąc formGroup wystąpieniem FormGroup.
źródło
Jestem bardzo spóźniony, ale znalazłem inny sposób, w którym nie trzeba mieć pętli. możesz zresetować tablicę, ustawiając kontrolkę tablicy na pustą.
Poniższy kod zresetuje twoją macierz.
this.form.setControl('name', this.fb.array([]))
źródło
Podczas gdy pętla zajmie dużo czasu, aby usunąć wszystkie elementy, jeśli tablica zawiera 100 elementów. Możesz opróżnić zarówno kontrolki, jak i właściwości wartości FormArray, jak poniżej.
clearFormArray = (formArray: FormArray) => {formArray.controls = []; formArray.setValue ([]); }
źródło
Aby kod był czysty, stworzyłem następującą metodę rozszerzenia dla każdego, kto używa Angular 7 i niższych. Można to również wykorzystać do rozszerzenia innych funkcji formularzy reaktywnych.
źródło