Вы можете разделить реактивную форму на несколько подформ, но вам нужно использовать ControlValueAccessor и его друга, и вам нужно вложить его в родительскую форму, откуда вы ее отправляете. И, конечно же, вам нужно добавить дополнительный шаблон, чтобы иметь всю валидацию и все остальное, что требуется для реактивных форм.
Таким образом вы можете иметь столько подформ, сколько захотите.
Ниже вы можете увидеть пример того, как вы можете сделать это способом Angular:
Дочерний компонент
import { Component, OnInit, forwardRef } from '@angular/core';
import {
NG_VALUE_ACCESSOR,
NG_VALIDATORS,
ControlValueAccessor,
Validator,
FormGroup,
FormBuilder,
AbstractControl,
ValidationErrors,
Validators
} from '@angular/forms';
@Component({
...
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ChildComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => ChildComponent),
multi: true
}
]
})
export class ChildComponent implements OnInit, ControlValueAccessor, Validator {
public childForm: FormGroup;
public onTouched: () => void = () => {};
constructor(private fb: FormBuilder) {}
ngOnInit(): void {
this.childForm = this.fb.group({
...
});
}
public writeValue(val: any): void {
return val && this.childForm.setValue(val, { emitEvent: false });
}
public registerOnChange(fn: any): void {
this.childForm.valueChanges.subscribe(fn);
}
public registerOnTouched(fn: any): void {
this.onTouched = fn;
}
public setDisabledState?(isDisabled: boolean): void {
isDisabled ? this.childForm.disable() : this.childForm.enable();
}
public validate(control: AbstractControl): ValidationErrors | null {
return this.childForm.valid
? null
: { invalidForm: { valid: false, message: 'Form is invalid' } };
}
}
Шаблон дочернего компонента:
<ng-container [formGroup]="childForm">
.....
</ng-container>
Родительский компонент ts
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';
@Component({
...
})
export class StandardSetupFormComponent implements OnInit {
parentForm: FormGroup;
constructor(private fb: FormBuilder) {}
ngOnInit(): void {
this.parentForm = this.fb.group({
child: null,
...
});
}
public onSubmit() {
...
}
}
Шаблон родительского компонента:
<form class="form" [formGroup]="parentForm" (ngSubmit)="onSubmit()">
<app-child formControlName="child"></app-child>
<button[disabled]="parentForm.invalid">Submit</button>
</form>
Как вы можете видеть в родительском компоненте, вам нужно рассматривать дочернюю форму как элемент управления.
Есть и другие способы сделать это. Например, используя входные данные, и даже если это выглядит проще, это неправильный путь.
Я прочитал отличную статью о том, что показывал вам выше go, но я не могу пока не найду. Я обновлю ответ, если сделаю это.
Здесь - это статья, которая даст вам лучшее и более глубокое понимание вложенности реактивных форм.