Я работаю над группой вложенных форм в Angular 14.
Существуют элементы управления формами, общие для нескольких форм, поэтому я добавил их частично.
В form.component.ts у меня есть:
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators, FormArray } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './form.component.html',
styleUrls: ['./form.component.css'],
})
export class FormComponent {
public form: FormGroup = new FormGroup({
first_name: new FormControl('', Validators.required),
last_name: new FormControl('', Validators.required),
email: new FormControl('', [Validators.required, Validators.email]),
phone: new FormControl('', Validators.required),
});
constructor() {}
ngOnInit(): void {}
public sendFormData() {
console.info(this.form.value);
}
}
В form.component.html я включаю частичное <app-additional></app-additional>:
<form [formGroup] = "form">
<mat-form-field appearance = "outline" floatLabel = "always">
<mat-label class = "mat-label">Fast name:</mat-label>
<input class = "mat-input" matInput formControlName = "first_name" />
</mat-form-field>
<mat-form-field appearance = "outline" floatLabel = "always">
<mat-label class = "mat-label">Last name:</mat-label>
<input class = "mat-input" matInput formControlName = "last_name" />
</mat-form-field>
<app-additional></app-additional>
<div class = "center">
<button
(click) = "sendFormData()"
mat-raised-button
color = "primary"
[disabled] = "!form.valid"
>
Submit
</button>
</div>
</form>
Смотрите Stackblitz ЗДЕСЬ.
Вместо рендеринга партиала приложение выдает ошибку:
Error: formControlName must be used with a parent formGroup directive.
@Eliseo Я сделал это (обновил Stackblitz), но проблема не устранена.
Вам нужно передать форму в качестве ввода в частичном
@RazvanZamfir, ваш разветвленный stackblitz работает только с добавлением провайдера (поставщик находится в дополнительном.компоненте)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно передать свою форму в качестве входных данных для частичного и указать там то же имя группы форм, чтобы оно работало.
В form.component.html:
<app-additional [form] = "form"></app-additional>
В дополнительном.component.html:
<div class = "more-controls" [formGroup] = "form">
В дополнительном.component.ts:
@Input() form: FormGroup;
Какой id <div class = "more-controls" [formGroup] = "form"> уже есть в группе форм?
Проблема вызвана тем, что элемент управления формой внутри частичного компонента () не привязан к родительской директиве FormGroup.
Чтобы устранить эту проблему, вы можете передать форму FormGroup из родительского компонента в частичный компонент, используя привязку свойства ([form]="form"), и привязать элемент управления формы внутри частичного компонента к родительской группе FormGroup, используя formControlName и директиву formGroup.
именно так :
<form [formGroup] = "form">
<!-- ... -->
<app-additional [form] = "form"></app-additional>
<!-- ... -->
</form>
извините за двойной ответ, я не видел, что это уже существующий ответ;)
N Fused, я знаю, что есть много ответов, которые используют в качестве ввода форму (даже так много мин), но правильный ответ - использовать провайдеров
добавьте
viewProviders:[{ provide: ControlContainer, useExisting: FormGroupDirective }], см. stackoverflow.com/questions/73455294/…