使用formarray

时间:2019-05-28 21:05:36

标签: angular angular-material angular-reactive-forms formarray mat-table

我最近坚持创建一个很大的表格。它主要具有简单的文本字段,但其中有很多,此外还包含一系列子对象。 从后端(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

我将为您提供任何提示。

1 个答案:

答案 0 :(得分:1)

刚刚回到这个问题-这真的很简单。您可以仅将formArray用作DataSource。确保先将其强制转换为FormArray,否则将保留为AbstractControl。

dataSource = (this.yourForm.controls.yourFormArray as FormArray).value)