【问题标题】:How to loop over Angular FormArray - currently sets as last item in loop如何循环 Angular FormArray - 当前设置为循环中的最后一项
【发布时间】:2019-04-30 13:25:43
【问题描述】:

我正在尝试遍历 FormArray 设置值。对 javascript 相当陌生。

TeamWorkingDate 以下为Team FormArray 中的 7 个 FormGroup 中的每一个设置为相同的日期,并设置为循环中的最后一个,日期 + 7 天。

我尝试了许多 forEach 的变体,并回答了 @JavaScript closure inside loops – simple practical example,因为我相信这一定是一些关闭问题。

尽管阅读了这篇文章,但我对闭包的理解是有限的。在这种情况下 - setValue 是否可以访问函数调用之外的变量 i 并且“看到”i = 7 也是如此?我以为let 可以解决这个问题?

  setDates(date: moment) {
    var arr = [];
    for(let i = 0; i < 7; i++) {
      let nextDate = date.clone().add(i, 'day');
      arr.push(nextDate);
      (<FormArray>this.myForm.get('Teams')).controls[i]
        .get('TeamWorkingDate').setValue(arr[i]);
    }
  }

我的表格:

  ngOnInit() {
    this.myForm = this.fb.group({
      Teams: this.fb.array([])
    });
    const team = this.fb.group({
      TeamWorkingDate: '',
      ...
    })
    for (let i = 0; i < 7; i++) {
      (<FormArray>this.myForm.get('Teams')).push(team);
    }
  }

编辑:更改为 let nextDate = date.clone().add(i, 'day'); 而不是 var

【问题讨论】:

  • 是的,let 停止了您正在谈论的问题,并且 IMK,setValue() 不是异步调用,因此这不应该成为问题。您遇到的问题是什么,您能再解释一下吗,我没有得到问题。
  • 我想将 TeamWorkingDate,FormArray 中的一个 FormGroup(7 个附加 OnInit)设置为 datedate+1 day 等,但我只是将此设置为 date+7 days全部。
  • 什么是date.clone()?它真的给出一个 newDate 并且不修改现有日期吗?
  • 日期是一个时刻(可变),是的,克隆复制...momentjs.com/docs/#/parsing/moment-clone
  • @AndrewAllen 为什么要在formArray中推送同一个组?

标签: javascript angular closures


【解决方案1】:

目前 formArray 中的所有 formGroups 都指向同一个 FormGroup 引用,因此在任何索引处更改值都会有效地更新同一个组。在 formArray 中创建并推送新的 FormGroup。

 ngOnInit() {
    this.myForm = this.fb.group({
      Teams: this.fb.array([])
    });
    for (let i = 0; i < 7; i++) {
      const team = this.fb.group({
      TeamWorkingDate: '',
        ...
      })
      (<FormArray>this.myForm.get('Teams')).push(team);
    }
  }

【讨论】:

  • 得到ERROR TypeError: this.fb.group(...) is not a function,但至少我现在知道出了什么问题。
  • @AndrewAllen FormBuilder 不是作为fb 注入到您的组件中吗?
  • 你的意思是像constructor(private fb: FormBuilder,
  • @AndrewAllen 是的,没错。它的类型为FormBuilder,当然这就是您能够创建表单并向其添加值的原因。可能只是您的编辑器无法识别该类型。您没有收到任何编译时/运行时错误吗?
  • 只需要一个分号。
猜你喜欢
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 2021-06-22
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多