首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我调用get Api angular 8时,我无法在formArray中动态创建formArray

当我调用get Api angular 8时,我无法在formArray中动态创建formArray
EN

Stack Overflow用户
提问于 2020-09-04 12:31:18
回答 2查看 294关注 0票数 0

当我获得数据时,我不能动态地创建表单控件。以及值,特别是类似formControl的任务和模板名称。提前谢谢。

代码语言:javascript
运行
复制
{
  "items": [
    {
      "templatename": "Defult",
      "tasks": [
        "task-1",
        "task-2 ",
        "task-3",
      ]
    },
    {
      "templatename": "Eccormce",
      "tasks": [
        "task-1 ",
        "task-2",

      ]
    },
    {
      "templatename": "co-oprate",
      "tasks": [
        "task-1",
        "task-2",
        "task-3"
      ]
    }
  ]
}
EN

回答 2

Stack Overflow用户

发布于 2020-09-04 14:32:05

我建议你迭代你的json值,然后创建不同的控件。

在初始化时,您可以创建第一个FormArray,然后获取它并将其推入json的所有items,最后对表示任务的其他FormArray执行相同的操作

代码语言:javascript
运行
复制
ngOnInit(){
  const items = this.json.items
  this.form = new FormGroup({
    items : new FormArray([])
  })
  let itemsForm = (<FormArray>this.form.get('items'))
  for (let i = 0; i < items.length; i++){
    itemsForm.push(this.initItem(items[i]))
  } 
}

initItem(item){
  let itemGroup = new FormGroup({
    templatename : new FormControl(item.templatename),
    tasks : new FormArray([])
  })
  let tasksItem = (<FormArray>itemGroup.get('tasks'))
  for (let i = 0; i < item.tasks.length; i++){
    tasksItem.push(new FormControl(item.tasks[i]))
  }
  return itemGroup;
}

当然,这是两次相同的迭代,只是FormArray和您放入其中的内容发生了变化,所以您可能可以在单个方法中对其进行分解,但这里只是向您展示如何进行嵌套FormArray

Here是一个工作堆栈闪电战,您可以在其中测试示例

票数 2
EN

Stack Overflow用户

发布于 2020-09-04 14:53:10

创建FormArrays的FormArray的过程与其他过程相同。唯一的问题是考虑如何引用formArrays。因此,首先创建两个辅助函数

代码语言:javascript
运行
复制
//it's a typical getter
//if you manage the formArray directly it's not necesary(*)
get itemsArray()
{
    return this.form.get("items") as FormArray
}

//see that this function is NOT a getter -has as argument an index-
getTasks(index:number)
{
    this.itemsArray.at(index).get('tasks') as FormArray
}

而且,如果外部formArray是一个返回formGroup的典型函数

代码语言:javascript
运行
复制
setItemsArray(data: any = null): FormGroup {
    data = data || { templatename: null, tasks: null };
    return new FormGroup({
      templatename: new FormControl(data.templatename, Validators.required),
      tasks: data.tasks
        ? new FormArray(data.tasks.map(x => new FormControl(x)))
        : new FormArray([])
    });
  }

因此,我们可以使用以下命令创建formArray

代码语言:javascript
运行
复制
const items=new FormArray(alldata.map(x=>this.setItemsArray(x))

现在,我们准备好处理formArray

代码语言:javascript
运行
复制
<form  [formGroup]="form">
    <div formArrayName="items">
        <div *ngFor="let group of itemsArray.controls;let i=index"
                      [formGroupName]="i">
           <!--here we has a inner formGroup--->
           <input formControlName="templatename">
           <div formArrayName="tasks">
                <div *ngFor="let control of getTasks(i).controls;let j=index">
                      <input [formControlName]="j">
                </div>
           </div>
        </div>
    </div>
</form>

奖励:

要在某个位置添加/删除新任务,只需

代码语言:javascript
运行
复制
addTask(index:number)
{
    this.getTask(index).push(new FormControl())
}
removeTask(index:number,indexTask:number)
{
    this.getTask(index).removeAt(indexTask)
}

添加/删除项目的步骤

代码语言:javascript
运行
复制
addItem()
{
    this.itemsArray.push(this.setItemsArray())
}
removeItem(index:number)
{
    this.itemsArray.removeAt(index)
}

(*)如果您愿意,您还可以在FormGroup中管理formArray独立-not -

如果您直接定义

代码语言:javascript
运行
复制
this.formArray=new FormArray(alldata.map(x=>this.setItemsArray(x))

并将函数索引(GetTasks)更改为

代码语言:javascript
运行
复制
getTasks(index)
{
    return this.formArray.at(i).get('tasks') as FormArray
}

您可以使用像这样的表单

代码语言:javascript
运行
复制
<form  [formGroup]="formArray">
    <div *ngFor="let group of formArray.controls;let i=index"
                  [formGroupName]="i">
       <!--here we has a inner formGroup--->
       <input formControlName="templatename">
       <div formArrayName="tasks">
            <div *ngFor="let control of getTask(i).controls;let j=index">
                  <input [formControlName]="j">
            </div>
       </div>
    </div>
</form>

你可以看到a stackblitz

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

https://stackoverflow.com/questions/63734864

复制
相关文章

相似问题

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