关于angular:Angular2:类型’AbstractControl’上不存在属性’controls’。 通过索引访问formarray中的对象的.control时出错

Angular2: Property 'controls' does not exist on type 'AbstractControl'. Error when accessing .control of an object within a formarray thru an index

我正在尝试在formarray中推送另一个formbuilder,但这给我一个错误,因为我认为初始化代码时数组中没有项目,因此没有控件。 错误是属性'controls'在类型'AbstractControl'之后不存在

1
(<FormArray>this.loanTypeForm.controls['frequency']).controls[index]

我正在使用角度2.0.0-beta.17

1
2
3
4
5
6
7
8
9
10
11
12
13
let settingsForm: FormArray = new FormArray([]);
      (<FormArray>this.loanTypeForm.controls['frequency']).push(
        this.formBuilder.group({
          'name': [value, Validators.required],
          'settings': settingsForm,
        })
      );
(<FormArray>this.loanTypeForm.controls['frequency']).controls[index].controls['settings'].push(
      this.formBuilder.group({
        'term': [null, Validators.required],
        'eir': [null, Validators.required],
      })
    );


您可以使用['controls']代替.controls,如下所示:

1
(<FormArray>this.loanTypeForm.controls['frequency']).controls[index]['controls']['settings'].push(...)

但是为了简化并提供更高的可读性,建议您将其全部更改为:

1
2
const control = this.loanTypeForm.get(`frequency.${index}.settings`) as FormArray;
control.push(...);


get()是访问表单控件的首选方法

1
this.loanTypeForm.get(`frequency.${index}.settings`)

看来loanTypeForm被视为AbstractControl ...所以让我们向编译器保证它是FormGroup

1
2
3
var group = this.loanTypeForm as FormGroup;
var array = group.controls['frequency'] as FormArray;
var control = group.controls[index]; // AbstractControl again.. could be casted as needed

如果该控件也是组或形式,我们也只需要使用assert(cast)

1
var control = group.controls[index] as FormGroup

然后我们可以轻松地继续

1
control.controls['settings']...


下面的代码正在工作

1
<FormArray>this.loanTypeForm.controls['frequency']).controls[index]['controls']['settings'].push(...)