【问题标题】:How can I add a formGroup to another formGroup如何将一个 formGroup 添加到另一个 formGroup
【发布时间】:2017-05-21 22:22:06
【问题描述】:

我找到了这个答案,它显示了如何将表单控件添加到父表单:

Reuse components in angular2 model driven forms

但我希望能够像这样将新的 formGroups 添加到页面的不同区域。

<form [formGroup]="myForm">
  <!--... other inputs -->
  <md-tab-group formGroupName="nutrition">
    <md-tab formGroupName="calories">
      <template md-stretch-tabs="always" md-tab-label>Calories</template>
      <template md-tab-content>
        <calories></calories> <!-- I want to add controll groups like this-->
      </template>
    </md-tab>
    <md-tab formGroupName="carbs">
      <template md-stretch-tabs="always" md-tab-label>Carbs</template>
      <template md-tab-content>
        <carbs></carbs>
      </template>
    </md-tab>
  </md-tab-group>
</form>

整个表单模型应该是这样的:

{
   name: '',
   nutrition:{
      calories: {
        total: ''
        // more
      },
      carbs: {
        total: ''
        // more
      }
}

我已经能够像这样添加nutrition formGroup:

&lt;nutrition [parentForm]="myForm"&gt;&lt;/nutrition&gt;

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

@Component({
  selector: 'nutrition',
  template: `
  <div [formGroup]="parentForm"></div>
  `
})
export class NutritionComponent implements OnInit {

    @Input() parentForm: FormGroup;

    nutritionGroup: FormGroup;

    constructor(private _fb: FormBuilder) {
    }

    ngOnInit() {
      this.nutritionGroup = new FormGroup({
        blank: new FormControl('', Validators.required)
      });
      this.parentForm.addControl('nutrition', this.nutritionGroup);
    }
}

但我不知道如何将nutrition 表单组传递给calories 表单组,如下所示:

&lt;calories [parentControl]="nutrition"&gt;&lt;/calories&gt;

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

@Component({
  selector: 'calories',
  template: ``
})
export class CaloriesComponent implements OnInit {

  @Input() parentControl: FormGroup;
  caloriesForm: FormGroup;

  constructor(private _fb: FormBuilder) {  }
  ngOnInit(){
    this.caloriesForm = new FormGroup({
        blank: new FormControl('', Validators.required)
      });

    this.parentControl.addControl('calories', this.caloriesForm);
  }
}

可以这样做吗?

【问题讨论】:

  • 你有解决办法吗?我有同样的问题
  • 是和不是。我现在正在实施一个 ngrx 商店解决方案。我可以拥有包含单个父表单的尽可能多的表单,这些表单将它们的值单独保存到我的商店。然后提交按钮调度一个从存储中调用值的操作。请注意此解决方案的验证器复杂性。

标签: angular typescript angular2-forms


【解决方案1】:

如果您(或任何人)仍然感兴趣,在将控件添加到您的parentControl 后,您需要将其发送回父组件,以便对其进行更新。

import { Output, EventEmitter } from '@angular/core';

@Output() onFormGroupChange: EventEmitter<FormGroup> = new EventEmitter<FormGroup>();

this.parentControl.addControl('calories', this.caloriesForm);
this.onFormGroupChange.emit(this.parentControl);

在父 html 元素上,您需要将其重新签名回parentControl(onFormGroupChange)="setParentControl($event)"

还有你ts上的方法

public setParentControl(formGroup: FormGroup) {
    this.myForm = formGroup;
}

然后,您将拥有 FormGroup myForm 中的控件,并在您的父元素上做任何您喜欢的事情: console.log(this.myForm.controls['calories'])

没有包含所有的代码,只包含你需要的:)

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2019-07-15
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多