【问题标题】:Angular 14: Propagate FormArray with API response to use in select optionAngular 14:使用 API 响应传播 FormArray 以在选择选项中使用
【发布时间】:2023-01-30 09:11:55
【问题描述】:

我想使用 API 的响应创建多个选择选项输入。

我已经用一个定义了这个表单表格数组输入。

this.myForm = this.fb.group({
  name: [null, [Validators.required]],
  details: this.fb.array([], Validators.required),
});

然后,getterdetail 输入 FormArray。

get detailsArr() {
  return this.myForm.get('details') as FormArray;
}

我从服务中获取数据并通过响应传播表单值。服务器对 details 的响应是这样的:

"details": [
  { "detailName": "detail 1", "detailValue": 2},
  { "detailName": "detail 2", "detailValue": 4},
  { "detailName": "detail 3", "detailValue": 5}
]
fetchData() {
  this.dataService.getData().subscribe((res) => {
    // Propagate details
    this.detailsArr.push(this.fb.control(res.details));

    // Propagate name
    this.myForm.patchValue({
      name: res.name,
    });
  });
}

重点是我不知道如何将细节数组的值设置为细节响应.使用 push 方法,我在数组中得到一个数组,我的意思是:

"details": [
  [
    { "detailName": "detail 1", "detailValue": 2}
  ]
]

HTML 如下:

<form [formGroup]="myForm">
  <div formArrayName="details">
    <select *ngFor="let detail of detailsArr.controls; let i = index" [formGroupName]="i">
      <option>{{ detail.detailName }}</option>
    </select>
  </div>
</form>

我在 for 循环中尝试使用 detailsArr.value 并且似乎有效,但不知道为什么。

我刚刚关注了this Angular official documentation,但是没有用。我不知道这是否是解决此问题的正确方法。

【问题讨论】:

    标签: javascript angular typescript forms formarray


    【解决方案1】:

    对于details数组中的每个元素,您需要将其作为FormGroup推送到detailsArrFormArray

    addDetailFormGroup(detail: any) {
      this.detailsArr.push(
        this.fb.group({
          detailName: detail.detailName,
          detailValue: detail.detailValue,
        })
      );
    }
    
    fetchData() {
      this.dataService.getData().subscribe((res) => {
        // Propagate details
        for (let detail of res.details) {
          this.addDetailFormGroup(detail);
        }
    
      ...
    }
    

    Demo @ StackBlitz

    更新

    正如 Post Owner 所澄清的,他想将从 API 响应接收到的数据绑定为 &lt;select&gt; 元素中的选项,FormArray 不应在他的场景中使用。当表单需要渲染包含多个FormControlFormGroup的元素时,使用FormArray

    【讨论】:

    • 感谢您的解决方案!它解决了我的数组内数组问题.无论如何,我的问题是&lt;select&gt;&lt;option&gt; 输入。正如您在演示中所做的那样,text 输入效果很好。
    • 你好,你的&lt;select&gt;&lt;option&gt;看起来怎么样? formControl 值是否与&lt;option&gt; 中的值匹配?如果您可以在 StackBlitz 中创建演示,那就太好了。
    • 这是演示:Demo @ StackBlitz&lt;select&gt; 在那里,但我无法绑定数据
    • 因为你的选项是空白的?您是否尝试将 details 数组呈现为 &lt;select&gt; 元素的选项?
    • 确切地。我想绑定 API 响应数据以传播 &lt;select&gt; 并绑定所选值。 FormArray 概念我错了。再次感谢!
    猜你喜欢
    • 2022-01-13
    • 2023-03-15
    • 1970-01-01
    • 2018-03-17
    • 2018-02-26
    • 2017-12-19
    • 2020-07-07
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多