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.
FormArray for dynamic fields in 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().
const emails = new FormArray([]); // Empty FormArray initially
const emails = new FormArray([ new FormControl('user@example.com') ]); // FormArray with one email control
push() to add a new control dynamically.emails.push(new FormControl('new@example.com')); // Adds a new email control to the FormArray
removeAt() to remove a control by its index.emails.removeAt(0); // Removes the first control from the FormArray
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.
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); } }
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.
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
FormArray in Angular forms?Solution
Step 1: Understand what FormArray does
FormArray is designed to hold multiple form controls dynamically, allowing adding or removing controls as needed.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.Final Answer:
To manage a dynamic list of form controls that can grow or shrink -> Option AQuick Check:
FormArray = dynamic list of controls [OK]
- Confusing FormArray with FormControl
- Thinking FormArray handles styling
- Assuming FormArray manages form submission
FormArray named emails?Solution
Step 1: Recall FormArray methods
The method to add a control to FormArray ispush().Step 2: Check each option
Only emails.push(new FormControl('')) usespush()correctly. Others are invalid methods for FormArray.Final Answer:
emails.push(new FormControl('')) -> Option CQuick Check:
Use push() to add control [OK]
- Using addControl() which is for FormGroup
- Trying appendControl() or insertControl() which don't exist
- Confusing FormArray with FormGroup methods
FormArray after execution?const tags = new FormArray([]);
tags.push(new FormControl('angular'));
tags.push(new FormControl('typescript'));
tags.removeAt(0);Solution
Step 1: Track push operations
Two controls are added, so length becomes 2.Step 2: Apply removeAt(0)
The first control is removed, reducing length by 1.Final Answer:
1 -> Option AQuick Check:
2 added - 1 removed = 1 [OK]
- Forgetting removeAt reduces length
- Assuming removeAt(0) removes last item
- Counting pushes only without removals
phones:phones.remove(1);
Solution
Step 1: Check FormArray removal methods
FormArray usesremoveAt(index)to remove controls by position.Step 2: Analyze the code
Callingremove(1)is invalid becauseremoveis not a FormArray method.Final Answer:
remove() is not a method of FormArray; should use removeAt() -> Option DQuick Check:
Use removeAt() to remove by index [OK]
- Using remove() instead of removeAt()
- Passing wrong argument types to removal methods
- Assuming remove() exists on FormArray
FormArray and adds a new empty email control when a button is clicked?Solution
Step 1: Correct initialization of FormArray
FormArray should be initialized with an empty array:new FormArray([]).Step 2: Adding new controls properly
Usepush(new FormControl(''))to add a new empty control dynamically.Final Answer:
Initialize with new FormArray([]) and add with emails.push(new FormControl('')) -> Option BQuick Check:
FormArray + push(new FormControl('')) = dynamic emails [OK]
- Using FormControl instead of FormArray for multiple inputs
- Trying to add controls with addControl() on FormArray
- Initializing FormArray with values instead of controls
Ready to prove it?
Pass the test and this pattern moves unknown
