是否可能将一个formArray嵌套在其他formArray内部并在HTML视图中正确地显示它?

我正在构建一个基于API响应的分页表单,所以我会迭代我的响应来创建这个表单,所以我最终会得到如下内容:

this.form = this.formBuilder.group({ pages : this.formBuilder.array([ this.formBuilder.array([]) ]) });

所以我的表单看起来像:

-> this.form = FormGroup (controls)
   -> pages = FormArray (controls)
      -> 0 = FormArray (controls)
        -> 0 = FormGroup (controls)
           -> Name (my form fields)
           -> Active (my form fields)

所以在DOM中浏览它对我来说很奇怪,我想知道是否有更好的方法来实现这个目标,或者这是正确的方法,

 <form [formGroup]="form" (ngSubmit)="onSubmit()">
     <ng-container formArrayName="pages">
       <ng-container *ngFor="let page of pages.controls; let i = index">
         <div *ngIf="i === paginationIndex" [formGroupName]="i">
           <div *ngFor="let myControl of page['controls']; let i = index" [formGroupName]="i">
             {{myControl.get('name')?.value }}
             <input type="text" formControlName="active">
           </div>
         </div>
       </ng-container>
     </ng-container>
     <div>
       <button class="btn" type="submit">Submit</button>
     </div>
</form>

推荐答案

是的,我们可以,我们应该创建两个formArrayName一个为pages,另一个为嵌套的表单数组名称索引,除此之外,我使用了一些函数来设置HTML中的元素的类型,这不是推断的,请参考下面的工作示例,让我知道如果有任何疑问!

我不认为在ng-container个元素上使用formArrayNameformGroupName等是个好主意,而是go 一个普通的DIV,因为元素不会在HTML中生成,我可能错了,只是一个建议!

当使用表单时,你想隐藏一些字段,总是go [hidden]隐藏元素,销毁元素可能会给你带来问题!

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

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [FormsModule, ReactiveFormsModule, CommonModule],
  template: `
    <form [formGroup]="form" (ngSubmit)="onSubmit()">
        <div formArrayName="pages">
          <div *ngFor="let page of pages.controls; let i = index" [formArrayName]="i">
            <div [hidden]="i !== paginationIndex">
              <div *ngFor="let myControl of setType(page).controls; let i = index" [formGroupName]="i">
                {{myControl.get('name')?.value }}
                <input type="text" formControlName="active">
              </div>
            </div>
          </div>
        </div>
        <div>
          <button class="btn" type="submit">Submit</button>
        </div>
    </form>
  `,
})
export class App {
  paginationIndex = 0;
  name = 'Angular';
  formBuilder = inject(FormBuilder);
  form: FormGroup = new FormGroup({});

  get pages() {
    return this.form.get('pages') as FormArray;
  }

  setType(page: any) {
    return page as FormArray;
  }

  ngOnInit() {
    this.form = this.formBuilder.group({
      pages: this.formBuilder.array([
        this.formBuilder.array([
          this.formBuilder.group({
            active: true,
          }),
          this.formBuilder.group({
            active: false,
          }),
        ]),
        this.formBuilder.array([
          this.formBuilder.group({
            active: true,
          }),
          this.formBuilder.group({
            active: false,
          }),
        ]),
      ]),
    });
  }

  onSubmit() {}
}

bootstrapApplication(App);

Stackblitz Demo

Angular相关问答推荐

RFDC.CommonJS或AMD依赖项可能会导致优化救助ANGURAL PROCEMENT with ngx-charts lib

如何使用新的@for遍历Angular 为17的对象?

路由在全局导航中总是给我/甚至使用相对路径

茉莉花-模板中调用了如何判断角管

如何使用来自不同可观测对象的值更新可观测对象

ngx-http-client 在 Angular 16 中已弃用

我需要取消订阅路由的可观察事件吗

如何处理Angular 延迟订阅

最新版本的 Chrome ERR_TIMED_OUT

如何从父路由的组件访问激活的子路由的数据?

为什么 Angular2 routerLinkActive 将活动类设置为多个链接?

Angular CLI 自定义 webpack 配置

无法绑定到matMenuTriggerFor,因为它不是 button的已知属性

请求 http.GET 时发送的 Angular2 OPTIONS 方法

在 Angular 中动态设置样式

Angular 2 Material - 如何居中进度微调器

unexpected token < 错误

如何使用无头浏览器运行测试?

如何升级 Angular CLI 项目?

如何将从后端渲染的参数传递给angular2 bootstrap 方法