您可以像这样在viewProviders 中使用ControlContainer:
control-container.ts
import { Provider, SkipSelf } from '@angular/core';
import { ControlContainer } from '@angular/forms';
export function controlProviderFactory(container: ControlContainer) {
return container;
}
export const CONTROL_CONTAINER: Provider = {
provide: ControlContainer,
useFactory: controlProviderFactory,
deps: [[new SkipSelf(), ControlContainer]],
};
child.component.ts
import { Component, OnInit, Input } from "@angular/core";
import { FormArray, FormControl, FormGroup, Validators } from "@angular/forms";
import { CONTROL_CONTAINER } from "../control-container";
@Component({
selector: "app-child",
templateUrl: "./child.component.html",
styleUrls: ["./child.component.css"],
viewProviders: [CONTROL_CONTAINER]
})
export class ChildComponent implements OnInit {
@Input() public form: FormGroup;
constructor() {}
ngOnInit() {}
}
child.component.html
<ng-container formArrayName="subForm">
<mat-input-container [formGroupName]="0">
<mat-form-field>
<input matInput formControlName="subControl">
</mat-form-field>
</mat-input-container>
</ng-container>
并在AppComponent的构造函数中初始化:
constructor (private formBuilder: FormBuilder) {
this.fg = this.formBuilder.group({
name: [null, Validators.required],
subForm: this.formBuilder.array([])
});
const control = <FormArray>this.fg.controls['subForm'];
control.push(this.formBuilder.group({
subControl: ['', Validators.required]
}));
}
有一个错误“当在 FormArray 中添加字段时,提交时不显示 mat-error”。在 GitHub here 上有描述。
基于您的代码的工作示例,您可以找到 here。