Angular 2 - 访问嵌套的 Formarrays (FormBuilder)

Squ*_*ura 2 forms nested angular

我正在使用 Angular 2 ReactiveForms 创建一个表单。该表格由模板、问题和答案组成。一个模板包含许多问题,问题包含许多答案。

ngOnInit() {
    // initialize template
    this.myForm = this.formBuilder.group({
        title: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(30)]],
        owner: [localStorage.getItem('user')],
        questions: this.formBuilder.array([
            this.initQuestion()
        ])
    }); 
}

initQuestion() {
    // initialize question
    return this.formBuilder.group({
        questionText: [{value: '', disabled: true}],
        answers: this.formBuilder.array([
            this.initAnswer()
        ])
    });
}

initAnswer() {
    // initialize answer
    return this.formBuilder.group({
        answerText: [{value: '', disabled: true}]
    });
}

addQuestion() {
    const control = <FormArray>this.myForm.controls['questions'];
    console.log(control);
    control.push(this.initQuestion());
}

addAnswer() {
    const control = <FormArray>this.myForm.get(['questions.0.answers']);
    control.push(this.initAnswer());
}
Run Code Online (Sandbox Code Playgroud)

我的目标是允许用户向模板添加问题,并回答每个问题。然而,我的问题是我无法访问名为“answers”的嵌套数组。到目前为止,我可以添加问题并且它工作正常,但是当我尝试添加问题的答案(addAnswer() 方法)时,我收到一条错误消息“无法读取 null 的属性‘push’” ,它引用了 addAnswer() 方法中的 control.push。任何帮助表示赞赏!

编辑:忘记添加我的 HTML 代码:

ngOnInit() {
    // initialize template
    this.myForm = this.formBuilder.group({
        title: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(30)]],
        owner: [localStorage.getItem('user')],
        questions: this.formBuilder.array([
            this.initQuestion()
        ])
    }); 
}

initQuestion() {
    // initialize question
    return this.formBuilder.group({
        questionText: [{value: '', disabled: true}],
        answers: this.formBuilder.array([
            this.initAnswer()
        ])
    });
}

initAnswer() {
    // initialize answer
    return this.formBuilder.group({
        answerText: [{value: '', disabled: true}]
    });
}

addQuestion() {
    const control = <FormArray>this.myForm.controls['questions'];
    console.log(control);
    control.push(this.initQuestion());
}

addAnswer() {
    const control = <FormArray>this.myForm.get(['questions.0.answers']);
    control.push(this.initAnswer());
}
Run Code Online (Sandbox Code Playgroud)

yur*_*zui 7

我认为你应该使用字符串

this.myForm.get('questions.0.answers')
Run Code Online (Sandbox Code Playgroud)

或数组之类的

this.myForm.get(['questions', 0, 'answers']);
Run Code Online (Sandbox Code Playgroud)

更新

根据你的html

addAnswer(idx: number) {
  const control = <FormArray>this.myForm.get(['questions', idx, 'answers']);
  control.push(this.initAnswer());
}
Run Code Online (Sandbox Code Playgroud)

并在 html

<a (click)="addAnswer(i)">Add answer</a>
Run Code Online (Sandbox Code Playgroud)

也可以看看