0

ReactiveForm我正在尝试Angular使用此数据层次结构创建一个:

-company
  -name
  -city
-employee1
  -name
  -planet
-employee2
  -name
  -planet

我创建了一个组件CompanyDetailsComponent和另一个EmployeeDetailsComponent

我想重用EmployeeDetailsComponentwith formGroupNames employee1 & employee2

这是代码堆栈闪电战

实际上我想让它适用于可变数量的员工我必须保持结构平坦(我不能使用员工数组,在这种情况下我会使用FormArray这样

因此,为了实现这种扁平的层次结构,我首先尝试为 2 名员工做这件事。

任何帮助将不胜感激

先感谢您!

4

3 回答 3

2

有几个步骤可以使它工作:

更改表单模板如下:

<form [formGroup]="form">
  <app-company-details></app-company-details>
  <app-employee-details jsonname="employee1"></app-employee-details>
  <app-employee-details jsonname="employee2"></app-employee-details>
</form>

根据提供的jsonname字符串创建嵌套表单组:

员工详细信息.component.ts

@Component({
  selector: 'app-employee-details',
  viewProviders: [
    {
      provide: ControlContainer,
      useExisting: FormGroupDirective
    }
  ],
  ...
})
export class EmployeeDetailsComponent implements OnInit {
  @Input() jsonname;

  constructor(private fb: FormBuilder, private fgd: FormGroupDirective) { }

  ngOnInit() {
    const group = this.fb.group({
      name: new FormControl(),
      planet: new FormControl()
    });

    this.fgd.form.addControl(this.jsonname, group);
  }
}

员工详细信息.component.html

<div [formGroupName]="jsonname">
  ...
</div>

Stackblitz 示例

于 2019-01-05T19:18:50.493 回答
1

我想你已经用 yurzui 的建议编辑了它,但我看了看并修复了一个阻止它工作的小错误,这是链接:

堆栈闪电战

您在属性周围有方括号,这些属性没有从组件中提取它们的值。例如,我更改[jsonname]="employee2"jsonname="employee2".

希望它现在按预期工作。

于 2019-01-05T21:26:30.440 回答
0

自 Angular 9 以来的问题不允许数字作为 formGroupName。这是由于严格的角度类型检查。下面的解决方案对我有用。

非工作代码:

<ng-container *ngFor="let configurationCtrl of configurationForm.get('configurations').value;
let i = index" [formGroupName]="i">

工作代码:

<ng-container *ngFor="let configurationCtrl of configurationForm.get('configurations')['controls'];
let i = index" [formGroupName]="i">

注意:我用控件替换了值。

于 2021-09-07T05:49:31.540 回答