Angular 5 - Formulärkontroll med objekt
Jag arbetar för närvarande på en Angular-applikation som stöds av Django.
En del av applikationen är att den behöver visa en lista över medlemmar. Medlemsarrayen ser ungefär ut så här:
[
{
name: 'John Smith',
id: 3,
score_set: [...]
},
{
name: 'Jane Doe',
id: 7,
score_set: [...]
},
{
name: 'Bill Appleseed',
id: 3,
score_set: [...]
},
{
name: 'Bob Lee',
id: 3,
score_set: [...]
}
]
Jag fick det att fungera, men jag behövde också att användaren skulle kunna redigera namnen på de medlemmarna. Jag försökte använda Reactive Forms för att få detta att fungera:
Först gjorde jag en FormGroup som bestod av endast en FormArray. Denna FormArray innehöll i princip alla medlemsobjekt:
this.form = this.fb.group({
roster: this.fb.array(this.members.map((elem) => [elem, Validators.required]))
});
Nästa skrev jag ut mallen för komponenten:
<form>
<div [formGroup]="form">
<div formArrayName="roster">
<div *ngFor="let control of form.controls.roster.controls">
<div class="form-group">
<input class="form-control" [formControl]="control" placeholder="Enter name">
</div>
</div>
</div>
</div>
</form>
Men istället för att visa varje medlems name-egenskap försöker den bara visa hela objektet, vilket blir [Object object]. Finns det något sätt att konfigurera varje FormControl att använda name-egenskapen som värde?
Jag vill att det ska vara så att endast namnet visas i <input>, och när användaren redigerar <input> uppdateras name-egenskapen hos objektet, samtidigt som alla andra egenskaper behålls.
All hjälp skulle uppskattas!
Svar #1
Eftersom du vill behålla hela objektet måste du skapa formGroups, så här:
interface Member {
id: number;
name: string;
}
ngOnInit(): void {
this.formGroup = this.formBuilder.group({
roster: this.formBuilder.array(this.members.map(member => this.createMemberGroup(member))),
});
}
createMemberGroup(member: Member): FormGroup {
return this.formBuilder.group({
...member,
name: [member.name, Validators.required],
});
}
HTML:
<form class="container pt-2" [formGroup]="formGroup">
<div formArrayName="roster">
<div
[formGroupName]="index"
*ngFor="let control of formGroup.get('roster').controls; index as index">
<div class="form-group">
<input
class="form-control"
formControlName="name"
placeholder="Enter name"
[class.is-invalid]="control.invalid">
<small class="text-danger" *ngIf="control.invalid">Required
</div>
</div>
</div>
</form>
DEMO
