Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 访问角度窗体的嵌套控件_Angular_Forms - Fatal编程技术网

Angular 访问角度窗体的嵌套控件

Angular 访问角度窗体的嵌套控件,angular,forms,Angular,Forms,我正在将一个应用程序从Angular 2升级到Angular 7,看起来我的大多数表单都坏了。我有多个实例收到以下错误: Property 'controls' does not exist on type 'AbstractControl' 在这个特定的实例中,我有一个块,它似乎在循环并验证表单数组 for (let i = 0, len = this.form.controls[control].controls.length; i < len; i++) { this.for

我正在将一个应用程序从Angular 2升级到Angular 7,看起来我的大多数表单都坏了。我有多个实例收到以下错误:

Property 'controls' does not exist on type 'AbstractControl'
在这个特定的实例中,我有一个块,它似乎在循环并验证表单数组

for (let i = 0, len = this.form.controls[control].controls.length; i < len; i++) {

  this.form.controls[control].controls[i].controls.ConditionTypeId.setValidators(Validators.required);
  this.form.controls[control].controls[i].controls.ConditionTypeId.updateValueAndValidity();
  this.form.controls[control].controls[i].controls.ToBeCompletedDate.setValidators(Validators.required);
  this.form.controls[control].controls[i].controls.ToBeCompletedDate.updateValueAndValidity();
}
for(设i=0,len=this.form.controls[control].controls.length;i

自从Angular 2以来,嵌套表单/表单数组的工作方式是否发生了重大变化?如果是这样,对我来说,以这种方式重构任何处理嵌套表单的代码最有效的方法是什么?

我不确定何时发生了变化,因为直到v4我才认真对待Angular。但我相信您的问题只是更严格的表单类的键入或重构。AbstractControl是这些表单类的通用抽象类。FormArray类扩展并添加了您要查找的
控件
属性。但是
FormGroup.controls[…]
只返回一般的AbstractControl。因此,在尝试从中获取控件之前,必须将其强制转换为FormArray:

(this.form.controls[control] as FormArray).controls[i].controls...
更常见的模式是为特定数组创建一个getter,但是支持ts文件中的一个简单函数可能更适合您的情况:

getFormArray(controlName) {
  return this.myForm.get(controlName) as FormArray;
}

看起来FormGroups被添加到了FormArray中,因此调用了
form.controls[…].controls[…].controls…
。您的两种解决方案都有效,但是我将尝试使用创建get方法的更优雅的解决方案。谢谢