Bird
Raised Fist0
Angularframework~5 mins

FormArray for dynamic fields in Angular

Choose your learning style10 modes available
Introduction

FormArray helps you manage a list of form controls that can grow or shrink. It is useful when you want users to add or remove fields dynamically.

When you want users to add multiple email addresses or phone numbers.
When you need a form where users can add or remove items like tasks or tags.
When the number of inputs is not fixed and depends on user actions.
When you want to validate a group of similar inputs together.
When building surveys or questionnaires with variable numbers of answers.
Syntax
Angular
import { FormArray, FormControl, FormGroup } from '@angular/forms';

const form = new FormGroup({
  items: new FormArray([
    new FormControl('')
  ])
});

// To add a new control dynamically
(form.get('items') as FormArray).push(new FormControl(''));

// To remove a control
(form.get('items') as FormArray).removeAt(index);

FormArray holds an array of FormControl or FormGroup instances.

You can add or remove controls dynamically using push() and removeAt().

Examples
This creates an empty FormArray with no controls.
Angular
const emails = new FormArray([]);
// Empty FormArray initially
FormArray starts with one control holding an email string.
Angular
const emails = new FormArray([
  new FormControl('user@example.com')
]);
// FormArray with one email control
Use push() to add a new control dynamically.
Angular
emails.push(new FormControl('new@example.com'));
// Adds a new email control to the FormArray
Use removeAt() to remove a control by its index.
Angular
emails.removeAt(0);
// Removes the first control from the FormArray
Sample Program

This Angular component creates a form with a dynamic list of email inputs. Users can add or remove email fields. The form value updates live and shows all emails entered.

Angular
import { Component } from '@angular/core';
import { FormArray, FormControl, FormGroup } from '@angular/forms';

@Component({
  selector: 'app-dynamic-form',
  template: `
    <form [formGroup]="form">
      <div formArrayName="emails">
        <div *ngFor="let emailControl of emails.controls; let i = index">
          <input [formControlName]="i" placeholder="Email {{i + 1}}" aria-label="Email {{i + 1}}" />
          <button type="button" (click)="removeEmail(i)" aria-label="Remove email {{i + 1}}">Remove</button>
        </div>
      </div>
      <button type="button" (click)="addEmail()">Add Email</button>
    </form>
    <pre>{{ form.value | json }}</pre>
  `
})
export class DynamicFormComponent {
  form = new FormGroup({
    emails: new FormArray([
      new FormControl('')
    ])
  });

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

  addEmail() {
    this.emails.push(new FormControl(''));
  }

  removeEmail(index: number) {
    this.emails.removeAt(index);
  }
}
OutputSuccess
Important Notes

Adding or removing controls updates the form state and validation automatically.

Time complexity for adding/removing is O(1) because it just changes the array.

Common mistake: forgetting to cast with as FormArray when accessing the FormArray controls.

Use FormArray when you have a list of similar inputs that can change size. Use FormGroup for fixed sets of controls.

Summary

FormArray manages a dynamic list of form controls.

You can add or remove controls easily with push() and removeAt().

It is perfect for forms where users add multiple similar inputs like emails or tags.

Practice

(1/5)
1. What is the main purpose of FormArray in Angular forms?
easy
A. To manage a dynamic list of form controls that can grow or shrink
B. To create a single form control with a fixed value
C. To style form inputs dynamically
D. To handle form submission events

Solution

  1. Step 1: Understand what FormArray does

    FormArray is designed to hold multiple form controls dynamically, allowing adding or removing controls as needed.
  2. Step 2: Compare options

    Only To manage a dynamic list of form controls that can grow or shrink correctly describes this dynamic list management. Others describe unrelated features.
  3. Final Answer:

    To manage a dynamic list of form controls that can grow or shrink -> Option A
  4. Quick Check:

    FormArray = dynamic list of controls [OK]
Hint: FormArray is for lists of controls, not single controls [OK]
Common Mistakes:
  • Confusing FormArray with FormControl
  • Thinking FormArray handles styling
  • Assuming FormArray manages form submission
2. Which of the following is the correct way to add a new control to a FormArray named emails?
easy
A. emails.insertControl(new FormControl(''))
B. emails.addControl(new FormControl(''))
C. emails.push(new FormControl(''))
D. emails.appendControl(new FormControl(''))

Solution

  1. Step 1: Recall FormArray methods

    The method to add a control to FormArray is push().
  2. Step 2: Check each option

    Only emails.push(new FormControl('')) uses push() correctly. Others are invalid methods for FormArray.
  3. Final Answer:

    emails.push(new FormControl('')) -> Option C
  4. Quick Check:

    Use push() to add control [OK]
Hint: Use push() to add controls to FormArray [OK]
Common Mistakes:
  • Using addControl() which is for FormGroup
  • Trying appendControl() or insertControl() which don't exist
  • Confusing FormArray with FormGroup methods
3. Given this code snippet, what will be the length of the FormArray after execution?
const tags = new FormArray([]);
tags.push(new FormControl('angular'));
tags.push(new FormControl('typescript'));
tags.removeAt(0);
medium
A. 1
B. 2
C. 0
D. 3

Solution

  1. Step 1: Track push operations

    Two controls are added, so length becomes 2.
  2. Step 2: Apply removeAt(0)

    The first control is removed, reducing length by 1.
  3. Final Answer:

    1 -> Option A
  4. Quick Check:

    2 added - 1 removed = 1 [OK]
Hint: Count pushes minus removes for length [OK]
Common Mistakes:
  • Forgetting removeAt reduces length
  • Assuming removeAt(0) removes last item
  • Counting pushes only without removals
4. Identify the error in this code snippet that tries to remove a control from a FormArray named phones:
phones.remove(1);
medium
A. remove() requires a FormControl argument, not an index
B. No error; remove() works fine
C. remove() should be called with a string index
D. remove() is not a method of FormArray; should use removeAt()

Solution

  1. Step 1: Check FormArray removal methods

    FormArray uses removeAt(index) to remove controls by position.
  2. Step 2: Analyze the code

    Calling remove(1) is invalid because remove is not a FormArray method.
  3. Final Answer:

    remove() is not a method of FormArray; should use removeAt() -> Option D
  4. Quick Check:

    Use removeAt() to remove by index [OK]
Hint: Use removeAt() to remove by index, not remove() [OK]
Common Mistakes:
  • Using remove() instead of removeAt()
  • Passing wrong argument types to removal methods
  • Assuming remove() exists on FormArray
5. You want to create a form where users can add multiple email addresses dynamically. Which approach correctly initializes the FormArray and adds a new empty email control when a button is clicked?
hard
A. Initialize with new FormGroup([]) and add with emails.push('')
B. Initialize with new FormArray([]) and add with emails.push(new FormControl(''))
C. Initialize with new FormControl([]) and add with emails.addControl(new FormControl(''))
D. Initialize with new FormArray(['']) and add with emails.insertControl(new FormControl(''))

Solution

  1. Step 1: Correct initialization of FormArray

    FormArray should be initialized with an empty array: new FormArray([]).
  2. Step 2: Adding new controls properly

    Use push(new FormControl('')) to add a new empty control dynamically.
  3. Final Answer:

    Initialize with new FormArray([]) and add with emails.push(new FormControl('')) -> Option B
  4. Quick Check:

    FormArray + push(new FormControl('')) = dynamic emails [OK]
Hint: Use FormArray([]) and push(new FormControl('')) to add fields [OK]
Common Mistakes:
  • Using FormControl instead of FormArray for multiple inputs
  • Trying to add controls with addControl() on FormArray
  • Initializing FormArray with values instead of controls
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard