我的窗体具有动态控件.我是这样定义它们的:

form = this._formBuilder.group({
  services: this._formBuilder.array([])
});
const servicesFormArray = this.form.get('services') as FormArray;

for (let service of quotation.services) {
  const serviceFormGroup = this._formBuilder.group({
    [service.serviceName]: this._formBuilder.control(false)
  });
  servicesFormArray.push(serviceFormGroup);
}

console.log(this.form)给出了以下结果:

enter image description here

我的目标是简化表单控件,go 掉0: FormGroup和第二个controls.所以我希望这个 struct 是这样的:

- controls
  - services
    - controls
      - My Product

我也是这样try 的:

const servicesFormArray = this.form.get('services') as FormArray;

for (let service of quotation.services) {
  const serviceFormGroup = this._formBuilder.group({
    [service.serviceName]: this._formBuilder.control(false)
  });
  
  const serviceControl = serviceFormGroup.get(service.serviceName);
  
  servicesFormArray.push(serviceControl);
}

但后来我得到了这样的 struct :

- controls
  - services
    - controls
      - [0]

如何实现所需的 struct ?

推荐答案

而不是formArray,我们可以只设置一个formGroup,然后使用addControl方法来添加各个表单值!

import { Component } from '@angular/core';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ReactiveFormsModule],
  template: `
    <h1>Hello from {{ name }}!</h1>
    <a target="_blank" href="https://angular.dev/overview">
      Learn more about Angular
    </a>
  `,
})
export class App {
  name = 'Angular';
  form = this._formBuilder.group({
    services: this._formBuilder.group({}),
  });

  quotation = {
    services: [
      {
        serviceName: 'test',
      },
      {
        serviceName: 'test1',
      },
      {
        serviceName: 'test2',
      },
    ],
  };

  constructor(private _formBuilder: FormBuilder) {}

  ngOnInit() {
    const servicesFormArray = this.form.get('services') as FormGroup;

    for (let service of this.quotation.services) {
      servicesFormArray.addControl(
        service.serviceName,
        this._formBuilder.control(false)
      );
    }
    console.log(this.form);
  }
}

bootstrapApplication(App);

stackblitz

Typescript相关问答推荐

如何在同一页面中使用布局和提供程序?

如何使用Generics保留构造函数的类型信息?

即使子网是公共的,AWS CDK EventBridge ECS任务也无法分配公共IP地址

用泛型类型覆盖父类函数导致类型y中的Property x不能赋给基类型Parent中的相同属性."'''''' "

在泛型类型中对子代执行递归时出错

泛型函数中输入参数类型的推断问题

带占位符的模板文字类型何时扩展另一个?

类型脚本映射类型:从对象和字符串列表到键值对象

如何从扩展接口推断泛型?

有什么方法可以类型安全地包装import()函数吗?

重载函数的T helper参数

有没有办法防止类型交集绕过联合类型限制?

TypeScrip-根据一个参数值验证另一个参数值

react 路由不响应参数

重写返回任何

埃斯林特警告危险使用&as";

React-跨组件共享功能的最佳实践

如何在Vuetify 3中导入TypeScript类型?

Typescript泛型-键入对象时保持推理

为什么我的 Typescript 函数中缺少 void 隐式返回类型?