使用 formarray 在反应形式中创建 editable mat-table
Create editable mat-table inside reactive form with formarray
我最近一直在创建一个非常大的表单。它主要有简单的文本字段,但其中有很多,另外还有一个子对象数组。
从后端(Django Rest Framework)我收到这个作为具有嵌套位置的对象。这些子对象应该显示在 editable 和 validatable mat-table 中,带有 mat-form-fields.
这是模型的一部分:
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 中。 mat-table 是一个不同的子组件,所以我传递如下形式:
在父组件中(auftragdetail.component.html):
<app-auftragposition [parentFormGroup]="auftragForm"></app-auftragposition>
在 mat-table 组件中 (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-fields 不需要数据源——它们通过表单来填充。我知道我可以输入一个简单的数组作为数据源。我制作了一个模拟数组并显示了数据。但是 1) 我不能从反应形式中得到一个数组(用 .get('') 和 .value 尝试了很多东西)和 2) 我认为它不会连接到反应形式并传递数据当我提交时返回...
也许问题是我如何创建我的反应形式。据我所知,mat-table 需要一个表格数组,其中填充了一个表格组作为行。也许我简单地传入对象的方式并没有创建真正的formarray。
我还可以找到这个 stackblitz,有人在其中写了一个特殊的数据源(我必须在这里做),但它并没有真正帮助我,因为它没有填充示例中的现有数据:
some Stackblitz example
如有任何提示,我将不胜感激。
刚刚回到这个问题上 - 这真的很简单。您可以只使用 formArray 作为数据源。确保首先将其转换为 FormArray,否则它将保持为 AbstractControl。
dataSource = (this.yourForm.controls.yourFormArray as FormArray).value)
我最近一直在创建一个非常大的表单。它主要有简单的文本字段,但其中有很多,另外还有一个子对象数组。 从后端(Django Rest Framework)我收到这个作为具有嵌套位置的对象。这些子对象应该显示在 editable 和 validatable mat-table 中,带有 mat-form-fields.
这是模型的一部分:
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 中。 mat-table 是一个不同的子组件,所以我传递如下形式:
在父组件中(auftragdetail.component.html):
<app-auftragposition [parentFormGroup]="auftragForm"></app-auftragposition>
在 mat-table 组件中 (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-fields 不需要数据源——它们通过表单来填充。我知道我可以输入一个简单的数组作为数据源。我制作了一个模拟数组并显示了数据。但是 1) 我不能从反应形式中得到一个数组(用 .get('') 和 .value 尝试了很多东西)和 2) 我认为它不会连接到反应形式并传递数据当我提交时返回...
也许问题是我如何创建我的反应形式。据我所知,mat-table 需要一个表格数组,其中填充了一个表格组作为行。也许我简单地传入对象的方式并没有创建真正的formarray。
我还可以找到这个 stackblitz,有人在其中写了一个特殊的数据源(我必须在这里做),但它并没有真正帮助我,因为它没有填充示例中的现有数据: some Stackblitz example
如有任何提示,我将不胜感激。
刚刚回到这个问题上 - 这真的很简单。您可以只使用 formArray 作为数据源。确保首先将其转换为 FormArray,否则它将保持为 AbstractControl。
dataSource = (this.yourForm.controls.yourFormArray as FormArray).value)