我试图用给定的键名和值来构建角形形式,这些键总是相同的.我已经设法建立一个表单,但输出格式不是我需要的.

keysToChange = ['key1', 'key2', 'key3', 'key4']

export interface PatchForm {
  [x: string]: FormControl<string | null>
  date: FormControl<string | null>
}

patchForm = this.fb.group({
  keysToChange: this.fb.array<FormGroup<PatchForm>>([]),
})

  initializeForm() {
    this.keysToChange.forEach((key) => {
      const formGroup = this.fb.nonNullable.group({
        [key]: new FormControl(''),
        date: new FormControl(''),
      })
      this.patchForm.controls.keysToChange.push(formGroup)
    })
  }

I get this output:

{
    "keysToChange": [
        {
            "key1": "",
            "date": ""
        },
        {
            "key2": "",
            "date": ""
        },
        {
            "key3": "",
            "date": ""
        },
        {
            "key4": "",
            "date": ""
        }
    ]
}

但我需要更多这样的东西

export interface PatchForm {
  id: FormControl<string | null>
  date: FormControl<string | null>
}

then output like this:

{
  "key1": {
    "id": "string",
    "date": "2024-04-03T11:23:05.499Z"
  },
  "key2": {
    "id": "string",
    "date": "2024-04-03T11:23:05.499Z"
  },
  "key3": {
    "id": "string",
    "date": "2024-04-03T11:23:05.499Z"
  },
  "key4": {
    "id": "string",
    "date": "2024-04-03T11:23:05.499Z"
  }
}

我遇到的问题主要是创建类型和初始化表单,因为我的eslint不允许不安全地使用类型'any',我不太明白如何初始化每个FormGroup的键.

推荐答案

我们需要创建一个formGroup,然后使用addControl添加每个具有键名和formgroup的控件.请找到下面的工作示例,让我知道如果有任何疑问!

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

export interface PatchForm {
  [x: string]: FormControl<string | null>;
  date: FormControl<string | null>;
}

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ReactiveFormsModule, CommonModule],
  template: `
    <form [formGroup]="patchForm">
      <div formGroupName="keysToChange">
        <div *ngFor="let item of iterKeys; let i = index" [formGroupName]="item">
          <input type="text" formControlName="id" id="id" name="id"/>
          <input type="date" formControlName="date" id="date" name="date"/>
        </div>
      </div>
    </form>
    {{patchForm.value | json}}
  `,
})
export class App {
  keysToChange = ['key1', 'key2', 'key3', 'key4'];
  name = 'Angular';
  fb = inject(FormBuilder);
  iterKeys: Array<string> = [];

  patchForm = this.fb.group({
    keysToChange: this.fb.group({}),
  });

  ngOnInit() {
    this.initializeForm();
  }

  initializeForm() {
    this.keysToChange.forEach((key) => {
      const formGroup = this.fb.nonNullable.group({
        id: new FormControl(''),
        date: new FormControl(''),
      });
      this.patchForm.controls.keysToChange.addControl(key, formGroup);
    });
    this.iterKeys = Object.keys(this.patchForm.controls.keysToChange.controls);
  }
}

bootstrapApplication(App);

Stackblitz Demo

Typescript相关问答推荐

为什么tsx不判断名称中有"—"的属性?'

状态更新后未触发特定元素的Reaction CSS转换

如何根据特定操作隐藏按钮

路由链接不会导航到指定router-outlet 的延迟加载模块

如何按不能保证的功能过滤按键?

在TypeScrip的数组中判断模式类型

如何在编译时为不带常量的参数引发错误

限制返回联合的TS函数的返回类型

将带有样式的Reaction组件导入到Pages文件夹时不起作用

Typescript,如何在通过属性存在过滤后重新分配类型?

类型脚本中参数为`T`和`t|unfined`的重载函数

将类型脚本函数返回类型提取到VSCode中的接口

使用强制转换编写打字函数的惯用方法

获取类属性的类型';TypeScript中的getter/setter

如何创建允许使用带有联合类型参数的Array.from()的TS函数?

数据库中的表请求返回如下日期:2023-07-20T21:39:00.000Z 我需要将此数据格式化为 dd/MM/yyyy HH:mm

在Typescript 无法正常工作的 Three.js 中更新动画中的 GLSL 统一变量

React router - 如何处理嵌套路由?

const 使用条件类型时,通用类型参数不会推断为 const

typeof 运算符和泛型的奇怪行为