【问题标题】:Angular 6 - Access to nested formArrayAngular 6 - 访问嵌套的 formArray
【发布时间】:2019-03-10 18:15:05
【问题描述】:

晚上好,

我已经建立了一个反应形式的结构。有一个鸡尾酒阵列,其中包括一个成分阵列。 这应该以我称为existingFlavForms 的反应形式进行投影。 问题是,我无法访问嵌套成分 formArray。

this.existingFlavForm = this.fb.group({
          flavs: this.fb.array([])
        });


for (let i = 0; i < this.cocktails.length; i++) {
      this.existingFlavForms.push(this.fb.group({
        id: [this.cocktails[i].id],
        c_name: [this.cocktails[i].c_name],
        mark: [this.cocktails[i].mark],
        imgUrl: [this.cocktails[i].imgUrl],
        ingrs: this.fb.array([
            {ingr: [this.cocktails[i].ingr]}
          ]
        )
      }));
    }

这是模板脚本,我尝试访问所有内容。

<form [formGroup]="existingFlavForm">
  <div formArrayName="flavs">
    <div *ngFor="let flav of existingFlavForms.controls; let i=index">
      <mat-expansion-panel class="myPanel">
        <mat-expansion-panel-header>
          <mat-panel-title>
            <h3 class="text-info"> {{flav.value.c_name}} </h3>
          </mat-panel-title>
          <mat-icon class="mr-lg-3 mt-lg-2">settings</mat-icon>
          <mat-icon class="mr-lg-3 mt-lg-2" (click)="deleteCocktail()">delete</mat-icon>
        </mat-expansion-panel-header>
        <div class="row">
          <div [formGroupName]="i">
            <div formArrayName="ingrs">
              <p *ngFor="let ingr of flav[i].controls.ingrs.controls;">
                {{ingr.i_name}}
              </p>
            </div>
          </div>
        </div>
      </mat-expansion-panel>
    </div>
  </div>
</form>

我搜索了类似的问题,但找不到合适的解决方案。数据在那里并且完全初始化。

这表示浏览器控制台.. "TypeError: undefined is not an object (evaluating '_v.context.$implicit[_v.context.index].controls')"

最好的问候!

我现在添加了一个基本的 stackblitz,它显示了带有虚拟数据的一般数据结构。 https://stackblitz.com/edit/angular-l3ghac

【问题讨论】:

  • 控制台的哪一行显示错误信息?
  • 在您的 for 循环中,您将推送到现有的 FlavForms,但这是一个 formGroup 而不是 formArray,因此它没有推送方法。
  • TypeError: undefined is not an object (evalating _v.context.$implicit[_v.context.index].controls') 在行
    但如果我删除在

    元素之后,我没有收到任何错误。所以这是迭代发生的那一行..

标签: angular angular-reactive-forms formarray


【解决方案1】:

我找到了解决办法:

问题是嵌套 FormArray 的初始化。

有了这个可以 sn-p 为我工作:

 initExistingFlavForm() {
this.clearArray();
for (let i = 0; i < this.cocktails.length; i++) {
  this.existingFlavForms.push(this.fb.group({
    id: [this.cocktails[i].id],
    c_name: [this.cocktails[i].c_name],
    mark: [this.cocktails[i].mark],
    imgUrl: [this.cocktails[i].imgUrl],
    liqs: this.fb.array([])
  }));
}
this.fillNestedIngredient();

}

fillNestedIngredient() {
for (let i = 0; i < this.cocktails.length; i++) {
  const ingrFormArray = this.existingFlavForm.get('flavs')['controls'][i].get('liqs') as FormArray;
  for (let c = 0; c < this.cocktails[i].ingr.length; c++) {
    ingrFormArray.push(this.fb.group({
      id: [this.cocktails[i].ingr[c].id],
      i_name: [this.cocktails[i].ingr[c].i_name],
      ml_bottle: [this.cocktails[i].ingr[c].ml_bottle],
    }));
  }
}

}

在 html 中的访问与往常一样使用外部 *ngFor:

<div formArrayName="liqs">
            <div *ngFor="let ingr of getIngredients(flav); let j = index" [formGroupName]="j">
            </div>
          </div>

【讨论】:

    【解决方案2】:

    您的元素是flav,因此在您的迭代中调用flav[i] 是多余的。在您的内部 for 循环中,将 flav[i].controls.ingrs.controls 替换为 flav.controls.ingrs.controls

    <p *ngFor="let ingr of flav.controls.ingrs.controls;">
        {{ingr.i_name}}
    </p>
    

    【讨论】:

    • 我同意冗余迭代,谢谢。但是,这不是想要的行为。看来我用你的代码 sn-p 得到了整个对象 ingrs,而不是我可以访问它们的属性的单个成分元素,如“i_name”
    • 在这种情况下,我认为你想要做的是:flav.controls.ingrs 而不是flav.controls.ingrs.controls
    • 试试这个:&lt;p *ngFor="let ingr of flav.controls.ingrs;"&gt; {{ingr.i_name}} &lt;/p&gt;
    • "找不到不同的支持对象 '[object Object]' 类型为 'object'。NgFor 仅支持绑定到 Iterables,例如数组。"
    • 此时我需要查看您的数据结构来解决问题。如果您可以使用示例数据更新您的问题,那么我会看看。
    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 2021-10-16
    • 2019-08-03
    • 2019-03-20
    • 2020-09-14
    • 1970-01-01
    • 2018-03-20
    • 2018-10-15
    相关资源
    最近更新 更多