Angular2:类型'AbstractControl'上不存在属性'控件'.通过索引访问formarray中对象的.control时出错

dec*_*nic 23 typescript angular

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

(<FormArray>this.loanTypeForm.controls['frequency']).controls[index]
Run Code Online (Sandbox Code Playgroud)

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

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],
      })
    );
Run Code Online (Sandbox Code Playgroud)

dev*_*033 69

您可以使用['controls']而不是.controls,如下所示:

(<FormArray>this.loanTypeForm.controls['frequency']).controls[index]['controls']['settings'].push(...)
Run Code Online (Sandbox Code Playgroud)

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

const control = this.loanTypeForm.get(`frequency.${index}.settings`) as FormArray;
control.push(...);
Run Code Online (Sandbox Code Playgroud)

  • 这就像一个魅力!谢谢! (2认同)

Rad*_*ler 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

var control = group.controls[index] as FormGroup
Run Code Online (Sandbox Code Playgroud)

然后我们可以轻松地继续

control.controls['settings']...
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 5

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

this.loanTypeForm.get(`frequency.${index}.settings`)
Run Code Online (Sandbox Code Playgroud)