Wiem, że odpowiedź została już udzielona, ale chcę udzielić krótkiej odpowiedzi, jak zaktualizować wartość formularza, aby inni nowi użytkownicy mogli uzyskać jasny pomysł.
Twoja struktura formularza jest tak idealna, aby użyć jej jako przykładu. tak więc w całej mojej odpowiedzi będę oznaczał to jako formę.
this.form = this.fb.group({
'name': ['', Validators.required],
'dept': ['', Validators.required],
'description': ['', Validators.required]
});
więc nasz formularz jest obiektem typu FormGroup, który ma trzy FormControl .
Istnieją dwa sposoby aktualizacji wartości modelu:
Użyj metody setValue (), aby ustawić nową wartość dla indywidualnej kontrolki. Metoda setValue () ściśle odpowiada strukturze grupy formularzy i zastępuje całą wartość kontrolki.
Użyj metody patchValue (), aby zastąpić wszelkie właściwości zdefiniowane w obiekcie, które uległy zmianie w modelu formularza.
Ścisłe sprawdzenia metody setValue () pomagają wychwycić błędy zagnieżdżania w złożonych formularzach, podczas gdy patchValue () po cichu zawodzi w przypadku tych błędów.
Z oficjalnej dokumentacji Angulara tutaj
tak więc podczas aktualizowania wartości dla wystąpienia grupy formularzy, które zawiera wiele kontrolek, ale możesz chcieć zaktualizować tylko części modelu. patchValue () jest tym, którego szukasz.
zobaczmy przykład. Kiedy używasz patchValue ()
this.form.patchValue({
dept: 1
});
//here we are just updating only dept field and it will work.
ale kiedy używasz setValue () , musisz zaktualizować pełny model, ponieważ ściśle odpowiada on strukturze grupy formularzy. więc jeśli napiszemy
this.form.setValue({
dept: 1
});
// it will throw error.
Musimy przekazać wszystkie właściwości modelu grupy formularzy. lubię to
this.form.setValue({
name: 'Mr. Bean'
dept: 1,
description: 'spome description'
});
ale nie używam tego stylu często. Wolę stosować następujące podejście, które pomaga zachować czystość i czytelność kodu.
To co robię, to deklaruję wszystkie kontrolki jako osobną zmienną i używam setValue () do aktualizacji tej konkretnej kontrolki.
dla powyższego formularza zrobię coś takiego.
get companyIdentifier(): FormControl {
return this.form.get('name') as FormControl;
}
get dept(): FormControl {
return this.form.get('dept') as FormControl;
}
get description(): FormControl {
return this.form.get('description') as FormControl;
}
kiedy musisz zaktualizować kontrolkę formularza, użyj tej właściwości, aby ją zaktualizować. W przykładzie pytający próbował zaktualizować kontrolkę formularza działu, gdy użytkownik wybierze pozycję z rozwijanej listy.
deptSelected(selected: { id: string; text: string }) {
console.log(selected) // Shows proper selection!
// instead of using this.form.controls['dept'].setValue(selected.id), I prefer the following.
this.dept.setValue(selected.id); // this.dept is the property that returns the 'dept' FormControl of the form.
}
Proponuję rzucić okiem na FormGroup API, aby poznać wszystkie właściwości i metody FormGroup.
Dodatkowe : aby dowiedzieć się więcej o getter, zajrzyj tutaj