【问题标题】:Angular - FormBuilder, how to group multiple Form ControlsAngular - FormBuilder,如何对多个表单控件进行分组
【发布时间】:2019-03-28 15:47:04
【问题描述】:

我使用Formbuilder创建一个FormGroup:

myForm = this.fb.group(
            {
                title: [""],
                fixed_grade1: [""],
                fixed_value1: [""],
                fixed_grade2: [""],
                fixed_value2: [""],
                fixed_grade3: [""],
                fixed_value3: [""],
                fixed_grade4: [""],
                fixed_value4: [""]
            });

所有fixed_gradefixed_value 都是输入和下拉菜单。

我有 4 对它们,这可以正常工作。

但现在我想对这些进行分组,因此我不必逐个访问控制器中的每个值,每个值都使用myForm.get("fixed_grade1").value

但我希望所有这些值都分组在一个数组中,例如:

myArray: [{grade, value}, [grade, value}...]

所以我可以通过以下方式访问它们的值:myArray[0].grade

我没有将每个单个值映射到一个新数组,而是看到FormBuilder 中有一个FormArray,我似乎无法正确实现它。

实现我所描述的正确语法是什么,正好有 4 对成绩/分数,而且重要的是在我的最终数组中包含所有这些对成绩/分数,我只有未定义的值,所以如果在我的表格中用户只填写一对成绩/分数,那么我的myArray.length 将是 1。

【问题讨论】:

    标签: javascript angular forms formbuilder formgroups


    【解决方案1】:

    您定义了您的FormGroup 错误。你的FormGroup 应该有一个FormArrayFormGroups。在每个FormGroups 中,应该有两个FormControls 用于gradevalue

    将您的表单更改为:

    const grades = [
      {grade: 'Grade 1', value: 'Value 1'},
      {grade: 'Grade 2', value: 'Value 2'},
      {grade: 'Grade 3', value: 'Value 3'},
      {grade: 'Grade 4', value: 'Value 4'}
    ]
    
    myForm = this.fb.group({
      title: [],
      grades: this.fb.array(this.grades.map(grade => this.fb.group({
        grade: [grade.grade],
        value: [grade.value]
      }))),
    });
    
    // OR
    
    myForm = this.fb.group({
      title: [],
      grades: this.fb.array(this.grades.map(grade => this.fb.group({
        grade: [],
        value: []
      }))),
    });
    ...
    get gradesArray() {
      return (<FormArray>this.myForm.get('grades')).controls;
    }
    ...
    getArrayGroupControlByIndex(index) {
      return (<FormArray>this.myForm.get('grades'))
        .at(index);
    }
    

    这是您将在模板中使用它的方式:

    <form [formGroup]="myForm">
      <input type="text" formControlName="title">
      <br>
      <div formArrayName="grades">
        <div *ngFor="let gradeGroup of gradesArray; let i = index;">
          <div [formGroupName]="i">
            Group {{ i + 1 }}
            <input type="text" formControlName="grade">
            <input type="text" formControlName="value">
          </div>
          <br>
        </div>
      </div>
    </form>
    

    这里有一个Sample StackBlitz 供您参考。

    【讨论】:

    • ok 我试试这个,我试过做:fixed_pa​​irs: this.fb.array([this.createPairs()]),然后方法 createPairs -> createPairs(): FormGroup { return this.fb.group({ 等级:",分数:" }); } 但我遇到了错误,你的方法似乎很清楚,我会尝试让你知道
    • 和其他问题,关于我的表单构建器之前是如何设置的,在我看来,我对每个值都有一个 formControlName="fixed_value1",如果我按照你的方式进行操作,我该如何在我的模板中分配formBuilder 数组中的每一个值到输入或下拉列表中?
    • 就是这样,完美运行,正是我需要的!最后一件事,如果对于我的表单生成器的另一个字段的单个值,我正在检索这样的数据:myForm.get("title").value,并使用 .valueChanges 订阅更改,我应该如何访问特定值这个新形式的数组? myForm.get("grades")[x].grade.value ?其中 x 是我要访问的对象的索引?同时将您的答案标记为正确的!谢谢
    • @AJ989,看看我刚刚添加到答案中的getArrayGroupControlByIndex 方法。
    • 是的,我在 stackoverflow 上也找到了该解决方案,谢谢,试图弄清楚最后一件事,如何手动设置值,对于我刚刚使用的其他单个值 .get("xx") .setValue,我在这里尝试做: (this.myForm.get('grades')) .at(index).grade.setValue(x);但它似乎不起作用!
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2019-02-08
    • 2011-07-03
    相关资源
    最近更新 更多