首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角反应形式模组

角反应形式模组
EN

Stack Overflow用户
提问于 2020-09-26 21:23:41
回答 4查看 865关注 0票数 0

我需要在同一个节点下为两个不同的数组设置一个formControl,这样我就可以在给定的反应性表单中添加和删除各自的嵌套节点。

预期JSON格式:

代码语言:javascript
复制
{
  "title": null,
  "days": [
    {
      "date": null,
      "nodes": [
        {
          "type": "leg",
          "from": null,
          "to": null
        },
        {
          "type": "activity",
          "category": null
        }
      ]
    }
  ]
}

我已经实现了控制的日期和节点,我能够分别添加和删除表单字段,但我需要单独的控制类型,腿和活动下的节点。

这里有实现嵌套formControl的任何方法吗?

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

代码语言:javascript
复制
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 -> from’

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-09-28 21:51:41

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

代码语言:javascript
复制
[
 {"type": "leg","from": null,"to": null,"category": null}
 {"type": "leg","from": null,"to": null,"category": null}
]

formArray需要的所有元素都具有sames属性。

问题:节点只是一个包含两个元素的数组(一个用于控制腿,另一个用于控制类别)?

在本例中,days是一个formArray,每个元素都是一个带有两个peoperies的formGroup,其中一个是,一个是包含两个元素的数组(而不是formArray)。

代码语言:javascript
复制
form=new FormGroup({
  title:new FormControl()
  days:new FormArray([
     date:new FormControl(),
     nodes:[new FormGroup({...}),new FormGroup({..})]
  ])
})

在这种情况下,您可以有三个getter。

代码语言:javascript
复制
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]

代码语言:javascript
复制
<div [formGroup]="category[i]">
   <input formControlName="from">
   ...
</div>

否则我就听不懂你的话了

票数 0
EN

Stack Overflow用户

发布于 2020-09-27 04:06:15

尝试使用双向数据绑定。这将简化您的过程。

例:

代码语言:javascript
复制
<input type="text" name="name" [(ngModel)]="model.name">
票数 0
EN

Stack Overflow用户

发布于 2020-09-27 11:12:14

凯萨马一步一步。在一个formArray中有一个formArray,所以创建两个返回formArray的函数

代码语言:javascript
复制
  get days():FormArray
  {
    return this.formGroup.get('days') as FormArray;
  }
  getNodes(i:number):FormArray
  {
    return this.days.at(i).get('nodes') as FormArray
  }

那么,要创建表单除法并使用三个函数:

代码语言:javascript
复制
  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

代码语言:javascript
复制
<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中

代码语言:javascript
复制
this.formGroup=this.createForm(this.data)

如果要向索引索引中的节点添加新节点,请确保使用

代码语言:javascript
复制
   this.getNodes(index).push(this.createNodes())

并向days数组中添加一个新节点。

代码语言:javascript
复制
   this.days.push(this.createDays())

不完全堆栈闪电战

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64082632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档