angular - Använda mall med nästlad ngfor
Skapa ett formulär med Angular4 ReactiveForm (versionen jag använder). Jag har ett formulär som har Kod, År och en lista med kategorier.
Huvudform:
- Kod
- År
Kategorier[]
- Kod
- Beskrivning
- Beställning
Produkter[]
- Kod
- Beskrivning
- Pris
Men jag försöker visa formuläret på följande sätt, där kategorilistans och produkterna i varje kategori skulle vara alla rader, och allt skulle visas i samma tabell (exempel):
<input code>
<input year>
<table>
<tr>Category 1</tr>
<tr>Product 1.1</tr>
<tr>Product 1.2</tr>
<tr>Product 1.3</tr>
<tr>Category 2</tr>
<tr>Product 2.1</tr>
<tr>Product 2.2</tr>
</table>
<button addNewCategory />
<button addNewProduct />
Jag kunde visa kategorierna som rader, men jag kan inte visa produkterna i varje kategori som en rad under kategoriraden:
Mitt TypeScript-formulär:
ngOnInit() {
this.form = this._fb.group({
code: ['', Validators.required],
year: ['', Validators.required],
categories: this._fb.array([this.initCategory()])
});
}
initCategory() {
return this._fb.group({
code: ['', Validators.required],
desc: ['', Validators.required],
order: ['', Validators.required],
products: this._fb.array([this.initProduct()])
});
}
initProduct() {
return this._fb.group({
code: ['', Validators.required],
desc: ['', Validators.required],
price: ['', Validators.required]
});
}
När jag sökte, fick jag veta att jag skulle använda ngfor-mallar, men jag kan inte använda dem, när jag försöker använda dem visas inte innehållet i template-taggen.
Om jag använder divs kan jag visa produkterna under varje kategori. Men det fungerar inte så bra inuti en tabell.
Min mall:
<div>
<form [formGroup]="form">
<input type="text" formControlName="code" />
<input type="text" formControlName="year" />
<table>
<div formArrayName="categories">
<template *ngFor="let category of form.controls['categories'].controls; let i=index">
<tr>
<td><input type="text" formControlName="code" /></td>
<td><input type="text" formControlName="desc" /></td>
<td><input type="text" formControlName="order" /></td>
</tr>
<div="products">
<template *ngFor="let product of category.controls['products'].controls; let j=index">
<tr>
<td><input type="text" formControlName="code" /></td>
<td><input type="text" formControlName="desc" /></td>
<td><input type="text" formControlName="price" /></td>
</tr>
</template>
</div>
</template>
</div>
</table>
</form>
</div>
Svar #1
Först och främst bör du använda ng-template eftersom template blev föråldrat i v4.
Förmodligen, om du tittar i din webbläsares konsol, kommer du att se ett fel som detta:
FEL Fel: Kan inte hitta kontroll med sökvägen: 'ARRAY_NAME -> FORM_CONTROL_NAME'
För att fixa det måste du omsluta category med formGroupName:
<tr [formGroupName]='i'>
...
</tr>
Och för products:
<div="products" formArrayName="products">
...
<tr [formGroupName]='j'>
...
</tr>
...
</div>
Det borde fungera om allt är korrekt på din component-fil.
