【问题标题】:FormArray return null?FormArray 返回空值?
【发布时间】:2020-05-31 12:51:08
【问题描述】:

问候。我尝试了多种方法,但没有一种方法有效。我在这,现在。我需要发起一个 formArray 的电子邮件

email: [testestest]

但我得到了:

email: [testestest]

但我的电子邮件返回 n 点击。检查我的ts

还有我的html:

【问题讨论】:

  • 你能创建一个堆栈闪电战来复制这个问题吗?

标签: angular typescript forms formarray


【解决方案1】:

Alex,你有一个 FormControls 的表单数组,而不是一个 formGroups 的表单数组。所以你的 .html 一定是这样的

<form *ngIf="addForm" [formGroup]="addForm">
    <div class="form-control-row" formArrayName="email"
        *ngFor="let item of addForm.get('email').controls; let i = index;">
        <div class="input-box">
            <input type="text" placeholder="E - mail" [formControlName]="i">
            <img src="../../assets/Delete.svg" alt="x-icon">
      </div>
        </div>
</form>

看到你没有 [fomGroupName]="i",你使用 [formControlName]="i"

其他方式

<form *ngIf="addForm" [formGroup]="addForm">
    <div class="form-control-row" formArrayName="email"
        *ngFor="let item of addForm.get('email').controls; let i = index;">
        <div class="input-box">
            <input type="text" placeholder="E - mail" [formControl]="item">
            <img src="../../assets/Delete.svg" alt="x-icon">
      </div>
        </div>
</form>

看到在这种情况下我们使用 [formControl]="item"(item 是您在 *ngFor)

那么,如何创建 formArray?

如果您有一系列电子邮件,您可以这样做

    email:  this.formBuilder.array(
             this.email.map(x=>this.formBuilder.control(x))
          )

这就是你使用map创建了一个FormControls数组(在一个FormControl中转换数组的每个元素谁值数组的元素。

注意:在生产中,您需要为数组创建一个 getter

get emails()
{
    return this.form.get('email') as FormArray;
}

然后迭代

    *ngFor="let item of emails.controls; let i = index;">

[formGroupName]="i" 和 formControl 的使用与 FormGroup 的 FormArray 一起使用。例如你可以有

    email:  this.formBuilder.array(
             this.email.map(x=>this.formBuilder.group({email:x}))
          )

请参阅在这种情况下,将数组的每个元素转换为具有 FormControl“称为”电子邮件的 formGroup 中的每个元素

您可以在stackblitz 中看到这一切。我希望这个例子能帮助你理解其中的区别

如果我们想向 formArray 添加一个元素,我们可以创建一个函数

  addEmail(email:any)
  {
    const array=this.addForm.get('email') as FormArray 
    array.push(this.formBuilder.control(email)) //if is a FormArray of FormControl

    const array2=this.addForm.get('email2') as FormArray
    array2.push(this.formBuilder.group({email:email})) //if is a FormArray of FormGroup
  }

注意:首先,如果我们想创建一个空的formArray,我们需要使用

    email:  this.formBuilder.array([])

当我们要删除数组的一个元素时,我们需要传递数组的“索引”,所以我们的delete函数是

delete(index:number)
  {
    const array=this.addForm.get('email') as FormArray
    array.removeAt(index)

  }

我们的 .html 是

  <div class="input-box">
        <input type="text" placeholder="E - mail" [formControl]="item">
        <img src="../../assets/Delete.svg" alt="x-icon" (click)="delete(i)">
  </div>

【讨论】:

  • 当我在 onInit 表单中设置 email: this.formBuilder.array( this.email.map(x=>this.formBuilder.group({email:x})) ) 我得到错误属性' map' 不存在于类型 'FormArray'.ts(2339)
  • 如何在没有创建数组电子邮件的情况下进行迭代:[....]? @eliseo
  • @alexic93939,我更新了答案(和 stackblitz)以创建一个添加 emal 的函数。关于错误,我不知道您将代码放在哪里。考虑到,当您创建 formArray 时,您需要创建为数组 - 它可以是空的,但需要是一个数组 -
  • 我有动态字段,我可以添加 3 或 4 个新字段..?
  • 你拯救了我的一天! @Elise 谢谢!你能帮我添加删除单个字段吗?谢谢!
猜你喜欢
  • 2020-02-26
  • 2021-05-02
  • 2021-07-07
  • 1970-01-01
  • 2021-12-21
  • 2015-11-07
  • 2020-05-20
  • 2020-11-08
  • 2013-10-09
相关资源
最近更新 更多