Как создать форму с несколькими компонентами в Angular 6?

Я пытаюсь создать реактивную форму, охватывающую несколько компонентов, что-то вроде этого

<form [formGroup]="myForm" (ngSubmit)="onSubmitted()">
   <app-names></app-names>
   <app-address></app-address>
   <app-phones></app-phones>
   <button type="submit">Submit</button>
</form>

Когда я пытаюсь отправить, я получаю пустой объект.

Stackblitz здесь


person Shadab Mehdi    schedule 14.10.2018    source источник


Ответы (2)


Сделайте следующие изменения

1. Используйте только один FormGroup вместо создания нового FormGroup для каждого компонента.

2. У вас есть @Input для FormGroup, но вы не передаете его в качестве входных данных.

3. Удалите FormBuilder из дочернего компонента.

app.component.html

<form [formGroup]="myForm" (ngSubmit)="onSubmitted()">
    <app-names [myForm]="myForm"></app-names>
    <app-address [myForm]="myForm"></app-address>
    <app-phones [myForm]="myForm"></app-phones>
    <button type="submit">Submit</button>
</form>

address.component.ts

import { Component, OnInit, Input} from '@angular/core';
import { FormControl, FormGroup,FormBuilder } from '@angular/forms';

@Component({
  selector: 'app-address',
  templateUrl: './address.component.html',
  styleUrls: ['./address.component.css']
})
export class AddressComponent implements OnInit {

  @Input() myForm: FormGroup;
  constructor(
    private formBuilder: FormBuilder
  ) { }

  ngOnInit() {
    this.myForm.addControl("homeAddress" , new FormControl());
    this.myForm.addControl("officeAddress" , new FormControl());
  }

}

Сделайте аналогичные изменения для других компонентов.

person Sunil Singh    schedule 14.10.2018

Есть еще один вариант сделать это без использования @Input

import { Component, OnInit } from '@angular/core';
import {
    FormControl,
    ControlContainer,
    FormGroupDirective
} from '@angular/forms';

@Component({
  selector: 'app-address',
  templateUrl: './address.component.html',
  styleUrls: ['./address.component.css'],
  viewProviders: [
    {
      provide: ControlContainer,
      useExisting: FormGroupDirective
     }
  ]
})
export class AddressComponent implements OnInit {
  constructor(private parent: FormGroupDirective) {}

  ngOnInit() {
    const myForm = this.parent.form;
    myForm.addControl("homeAddress", new FormControl());
    myForm.addControl("officeAddress", new FormControl());
  }
}
person katwhocodes    schedule 05.02.2019
comment
Спасибо миллиону товарищей, я никогда не видел такого способа сделать это, и я считаю его таким простым и понятным! - person Gregordy; 09.12.2020