Angular反应形式表单组

如何解决Angular反应形式表单组

我需要在同一节点下具有两个不同数组的formControl,以便可以以给定的反应形式添加和删除相应的嵌套节点。

期望的JSON格式:

{
  "title": null,"days": [
    {
      "date": null,"nodes": [
        {
          "type": "leg","from": null,"to": null
        },{
          "type": "activity","category": null
        }
      ]
    }
  ]
}

我在日期和节点上实现了控件,分别能够为其添加和删除表单字段,但是我需要单独的控件来控制leg和节点下的活动类型。

在这里有什么方法可以实现嵌套的formControl吗?

更新: 在表单数组下需要两个表单组,请帮助实现HTML。

initX() {
    return this.fb.group({
      'date': [],'nodes': this.fb.array([
        this.initY(),this.initZ()
      ]),});
  }

  initY() {
    return this.fb.group({
      'type': ['leg'],'from': [],'to': []
    })
  }

  initZ() {
    return this.fb.group({
      'type': ['activity'],'category':[],'cost':[]
    })
  }

错误:找不到路径为“天-> 0->节点-> 1->来源”的控件

可以在此处找到示例代码的堆栈闪电:https://stackblitz.com/edit/angular-ivy-fkgxrr

解决方法

尝试使用两种方式进行数据绑定。这将简化您的过程。

例如:

<input type="text" name="name" [(ngModel)]="model.name">
,

keethama,一步一步来。您在formArray内有一个formArray,因此使两个函数返回一个formArray

  get days():FormArray
  {
    return this.formGroup.get('days') as FormArray;
  }
  getNodes(i:number):FormArray
  {
    return this.days.at(i).get('nodes') as FormArray
  }

好,要创建表格划分并使用三个功能:

  createForm(data:any)
  {
    data=data || {title:null,days:null}
    return new FormGroup({
      title:new FormControl(data.title),days:data.days?
           new FormArray(data.days.map(d=>this.createDays(d))):
           new FormArray([])
      
    })
  }
  createDays(data:any=null)
  {
    data=data || {date:null,nodes:null}
    return new FormGroup({
        date:new FormControl(data.date),nodes:data.nodes?
              new FormArray(data.nodes.map(x=>this.createNodes(x))):
              new FormArray([])
    })
  }
  createNodes(data:any=null)
  {
    data={type:null,from:null,to:null,category:null,...data}
    return new FormGroup({
      type: new FormControl(data.type),from: new FormControl(data.from),to: new FormControl(data.to),category: new FormControl(data.category)
    })
  }

好吧,现在来看一下.html

<form *ngIf="formGroup" [formGroup]="formGroup">
  title:<input formControlName="title">
  <div formArrayName="days">
    <div *ngFor="let groupDays of days.controls;let i=index" [formGroupName]="i">
        date:<input formControlName="date">
        <div formArrayName="nodes">
          <div *ngFor="let groupnodes of getNodes(i).controls;let j=index" [formGroupName]="j">        
            type:<input formControlName="type"><br/>
        from:<input formControlName="from"><br/>

        to:<input formControlName="to"><br/>
        category:<input formControlName="category">
          </div>
        </div>
    </div>
  </div>
</form>

在ngOnInit中

this.formGroup=this.createForm(this.data)

请参见,如果要向索引索引中的节点添加新节点,则使用

   this.getNodes(index).push(this.createNodes())

并将新节点添加到days数组

   this.days.push(this.createDays())

一个incomplete stackblitz

,

好吧,在我的另一个答案中,“节点”数组就像

[
 {"type": "leg","from": null,"to": null,"category": null}
 {"type": "leg","category": null}
]

formArray的所有元素都具有相同的属性

问题:节点仅仅是具有两个元素的数组(一个用于控制Leg,另一个用于控制类别)?

在这种情况下,days是一个formArray,每个元素是一个带有两个Peperies的formGroup,其中一个是一个带有两个元素的数组(不是formArray)

form=new FormGroup({
  title:new FormControl()
  days:new FormArray([
     date:new FormControl(),nodes:[new FormGroup({...}),new FormGroup({..})]
  ])
})

在这种情况下,您可以使用三个吸气剂

get days():FormArray
{
    return this.formGroup.get('days') as FormArray;
}
get leg(index)
{
    return this.days.at(i).get('nodes')[0] as FormGroup
}
get category(index)
{
    return this.days.at(i).get('nodes')[1] as FormGroup
}

然后在div中直接使用[formGroup],例如

<div [formGroup]="category[i]">
   <input formControlName="from">
   ...
</div>

否则我无法理解您的json

,

我认为这可能不是一个完整的答案,因为使用嵌套FormArrays的工作示例将花费一些时间,但是我敢肯定,您会发现本文有趣而有用(在很多情况下对我有帮助这个):

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res