动态创建 formGroupName 无效 - Angular 反应形式
Creating formGroupName dynamically not working - Angular reactive forms
我正在尝试使用此数据层次结构在 Angular
中创建一个 ReactiveForm
:
-company
-name
-city
-employee1
-name
-planet
-employee2
-name
-planet
我创建了一个组件 CompanyDetailsComponent
和另一个 EmployeeDetailsComponent
我想将 EmployeeDetailsComponent
重新用于 formGroupName
s employee1 & employee2
这是代码stackblitz
实际上我想让它适用于可变数量的员工我必须保持结构平坦(我不能使用员工数组,在这种情况下我会使用 FormArray
之类的this)
因此,为了实现这种扁平的层次结构,我试图先为 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
字符串创建嵌套表单组:
员工-details.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);
}
}
员工-details.component.html
<div [formGroupName]="jsonname">
...
</div>
我想你已经根据 yurzui 的建议编辑了它,但我看了一下并修复了一个阻止它工作的小错误,这里是 link:
未从组件中提取值的属性用方括号括起来。比如我把[jsonname]="employee2"
改成jsonname="employee2"
.
希望它现在按预期工作。
自 angular 9 以来的问题不允许数字作为 formGroupName。这是由于 angular.Below 解决方案中的严格类型检查对我有用。
非工作代码:
<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">
注意:我用控件替换了值。
我正在尝试使用此数据层次结构在 Angular
中创建一个 ReactiveForm
:
-company
-name
-city
-employee1
-name
-planet
-employee2
-name
-planet
我创建了一个组件 CompanyDetailsComponent
和另一个 EmployeeDetailsComponent
我想将 EmployeeDetailsComponent
重新用于 formGroupName
s employee1 & employee2
这是代码stackblitz
实际上我想让它适用于可变数量的员工我必须保持结构平坦(我不能使用员工数组,在这种情况下我会使用 FormArray
之类的this)
因此,为了实现这种扁平的层次结构,我试图先为 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
字符串创建嵌套表单组:
员工-details.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);
}
}
员工-details.component.html
<div [formGroupName]="jsonname">
...
</div>
我想你已经根据 yurzui 的建议编辑了它,但我看了一下并修复了一个阻止它工作的小错误,这里是 link:
未从组件中提取值的属性用方括号括起来。比如我把[jsonname]="employee2"
改成jsonname="employee2"
.
希望它现在按预期工作。
自 angular 9 以来的问题不允许数字作为 formGroupName。这是由于 angular.Below 解决方案中的严格类型检查对我有用。
非工作代码:
<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">
注意:我用控件替换了值。