我最近坚持创建一个很大的表格。它主要具有简单的文本字段,但其中有很多,此外还包含一系列子对象。 从后端(Django Rest Framework),我将其作为具有嵌套位置的对象接收。这些子对象应显示在带有mat-form-fields的可编辑且可验证的mat-table中。
这是模型的一部分:
export class Auftrag{ // <-- parent
auftrag: number = null;
bezeichnung: string = '';
datum: Date = null;
ueberwachen: boolean = null;
erl: boolean = null;
[...]
auftragposition:Array<AuftragPosition> = null; //<-- children
}
export class AuftragPosition {
id: number = null;
auftrag: number = null;
position: number = null;
menge: number = null;
einheit: string = "";
beschreibung: string = "";
teil_nr: string = "";
artikel: string = ""
ep: number = null;
rabatt: number = null;
}
单个文本字段用作反应形式字段,我创建如下(因为确实有很多字段),并且有效:
this.auftragForm = this.fb.group(new Auftrag()); //fb is a formbuilder
之所以这样做,是因为我必须先在Django中编写大型模型,然后再在anguilar中编写,而我不想在创建表单时再次编写所有模型。 它还创建了字段“ auftragposition”,该字段(在日志中选中)是一个包含多个对象的数组(auftragposition)。这些应显示在垫子表中。 mat-table是一个不同的子组件,所以我通过如下形式:
在父组件(auftragdetail.component.html)中:
<app-auftragposition [parentFormGroup]="auftragForm"></app-auftragposition>
在垫子表格组件(auftragposition.component.ts)中:
@Input() parentFormGroup: FormGroup;
在auftragposition.comopnent.html中:
<div class="auftragposition" [formGroup]="parentFormGroup">
<mat-table class="auftragposition-table mat-elevation-z8" formArrayName="auftragposition" [dataSource]="dataSource"
matSort matSortActive="position" matSortDirection="desc" matSortDisableClear> [...]
问题出在这里是数据源。这有点令人困惑,因为mat字段不需要数据源-它们通过表格填充。我知道我可以输入一个简单的数组作为数据源。我做了一个模拟数组,它显示了数据。但是1)我无法从反应形式中获取数组(使用.get('')和.value尝试了很多事情)和2)我不认为它将被连接到反应形式并传递数据回到我提交...
也许问题出在如何我创建了我的反应形式。就我可以进行的研究而言,mat-table需要一个用一个表单组作为行填充的表单数组。也许我简单地传递对象的方式并没有创建真正的formarray。
我还可以找到这个堆栈闪电,有人在其中写了一个特殊的数据源(我必须在这里做),但是它并没有真正让我感到困扰,因为在示例中它没有填充现有数据: some Stackblitz example
我将为您提供任何提示。
答案 0 :(得分:1)
刚刚回到这个问题-这真的很简单。您可以仅将formArray用作DataSource。确保先将其强制转换为FormArray,否则将保留为AbstractControl。
dataSource = (this.yourForm.controls.yourFormArray as FormArray).value)