【问题标题】:Angular material stepper: Error: Cannot find control with name: 'formArray'角度材料步进器:错误:找不到名称为“formArray”的控件
【发布时间】:2018-03-23 04:26:45
【问题描述】:

我尝试在此处跟进如何设置角度材料步进器的步骤:https://material.angular.io/components/stepper/overview

我想要一个包含多个步骤的简单表单,所以我创建了这个:

<form [formGroup]="formGroup">
  <mat-horizontal-stepper formArrayName="formArray" linear>
    <mat-step formGroupName="0" [stepControl]="formArray.get([0])">
      <div>
        <button mat-button matStepperNext type="button">Next</button>
      </div>
    </mat-step>
    <mat-step formGroupName="1" [stepControl]="formArray.get([1])">
      <div>
        <button mat-button matStepperPrevious type="button">Back</button>
        <button mat-button matStepperNext type="button">Next</button>
      </div>
    </mat-step>
  </mat-horizontal-stepper>
</form>

我进入我的控制台:

ERROR Error: Cannot find control with name: 'formArray'
    at _throwError (forms.es5.js:1918)
    at setUpFormContainer (forms.es5.js:1891)
    at FormGroupDirective.webpackJsonp.../../../forms/@angular/forms.es5.js.FormGroupDirective.addFormArray (forms.es5.js:4849)
    at FormArrayName.webpackJsonp.../../../forms/@angular/forms.es5.js.FormArrayName.ngOnInit (forms.es5.js:5134)
    at checkAndUpdateDirectiveInline (core.es5.js:10856)
    at checkAndUpdateNodeInline (core.es5.js:12364)
    at checkAndUpdateNode (core.es5.js:12303)
    at debugCheckAndUpdateNode (core.es5.js:13167)
    at debugCheckDirectivesFn (core.es5.js:13108)
    at Object.eval [as updateDirectives] (MystepperComponent.htm

我的测试的完整源代码在这里:angular stepper test example on github

我确实尽了最大努力遵循文档,但我不明白我需要做些什么来修复它......

【问题讨论】:

    标签: angular angular-material2


    【解决方案1】:

    如果您想使用包含多个步骤的单个表单,您需要在组件的打字稿中实现 formGroupformArray。对于您的问题,您似乎没有在组件的打字稿文件中实现formArray。如下修改您的代码以使其工作。

    1. stepper.component.ts 应该如下所示。
    import { Component, OnInit } from '@angular/core';
    import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    
    @Component({
      selector: 'app-stepper',
      templateUrl: './stepper.component.html',
      styleUrls: ['./stepper.component.css']
    })
    
    export class StepperComponent implements OnInit {
    
      formGroup: FormGroup;
      constructor(private _formBuilder: FormBuilder) { }
    
      ngOnInit() {
        this.formGroup = this._formBuilder.group({
          formArray: this._formBuilder.array([
            this._formBuilder.group({}),
            this._formBuilder.group({})
          ])
        });
      }
    }
    

    数组中的两个this._formbuilder.group({}) 分别代表formArray-&gt;'0'formArray-&gt;'1'

    1. 同时更新您的stepper.component.html,如下所示。
    <form [formGroup]="formGroup">  
      <mat-horizontal-stepper formArrayName="formArray" linear>    
        <mat-step formGroupName="0" [stepControl]="formArray?.get([0])">
          <div>
            <button mat-button matStepperNext type="button">Next</button>
          </div>
        </mat-step>
        <mat-step formGroupName="1" [stepControl]="formArray?.get([1])">
          <div>
            <button mat-button matStepperPrevious type="button">Back</button>
            <button mat-button matStepperNext type="button">Next</button>
          </div>
        </mat-step>
      </mat-horizontal-stepper>
    </form>
    

    我已将 formArray.get([0]) 更改为 formArray?.get([0])formArray.get([1]) 更改为 formArray?.get([1]),因为 formArray 未定义。

    1. 确保在app.module.ts 中导入了所有必需的依赖项。

    您可以在给定的链接上找到有效的解决方案 - https://stackblitz.com/edit/angular-xuofwu

    【讨论】:

    • 不用改成:formArray?.get([0]),可以声明一个变量为:formArray:any;和然后在 ngOnInit() 方法上,可以初始化为: this.formArray = this._formBuilder.array([ ...]); 最后,你可以使用它如:this.formGroup = this._formBuilder.group({ formArray: this.formArray });。 ;)
    【解决方案2】:

    嗯,你的ngOnInit 有这样的表单组定义,

    ngOnInit() {
      this.formGroup = this._formBuilder.group({
        firstCtrl: ['', Validators.required]
      });
    }
    

    它没有定义formArray,因此当您在模板中引用formArrayName="formArray" 时,应用程序将期望在您的父formGroup 中有一个名为“formArray”的formArray 控件,声明为formGroup(在您的案例,来自这两个任务:-this.formGroup = ...&lt;form [formGroup]="formGroup"&gt;)。这解释了你必须回答你的问题的错误。但是您是否真的需要一个 formArray 取决于您要完成的工作,就您的问题而言,我认为这并不重要。

    此外,您似乎没有在模板中的任何地方使用定义为firstCtrl 的formControl。因此,基本上您在组件中定义为反应式表单(及其控件)的内容与您在模板中的内容不匹配,除了父 formGroup 名称 formGroup

    希望对你有帮助。

    【讨论】:

    • 谢谢,很酷很复杂 :) 所以我会尝试完全删除 formArray,formGroup 所有这些东西,看看它是否工作,会更新。
    • 删除了所有 formGroup formArray formArrayName Ctrl 并且所有看起来都正常。谢谢 :) 只是想按照这个例子......
    • @Jas,你的最终解决方案是什么?我也在为此苦苦挣扎。
    • @GenaroAlbertoCancinoHerrera 嗨,我刚刚清理了我的代码,看起来我根本不需要 formGroup formArray formArrayName 所以我刚刚删除了这段代码并且它有效,你尝试过这样的清理吗?跨度>
    • @Jas 非常感谢!
    猜你喜欢
    • 2021-12-04
    • 2020-05-30
    • 2020-06-25
    • 1970-01-01
    • 2021-08-15
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多