A Step-by-Step Tutorial on Angular FormArray Implementation

Sumit kumar Singh
Frontend Weekly
Published in
4 min readNov 30, 2023

--

Angular’s FormArray is a powerful tool for managing dynamic forms in your Angular applications. It allows you to handle scenarios where the number of form controls is not fixed and can change dynamically during runtime. In this tutorial, we will delve into FormArray in-depth, providing a step-by-step guide to its implementation. We’ll cover everything from setting up your Angular project to handling nested FormArrays.

Section 1: Understanding FormArray

1.1 Introduction to Reactive Forms

Angular provides two types of forms: Template-driven forms and Reactive forms. Reactive forms are more robust and offer better control, making them suitable for complex scenarios. Reactive forms are built around the FormGroup and FormControl classes and FormArray is an extension of these, designed to handle dynamic form controls.

1.2 When to Use FormArray

FormArray becomes essential when dealing with forms that have a variable number of form controls. For instance, imagine a scenario where you are creating a form for a shopping cart, and the user can add or remove items dynamically. Each item in the cart can have multiple properties like name, quantity, and price. FormArray allows you to handle this situation elegantly.

Section 2: Setting Up Your Angular Project

2.1 Installing Angular CLI

If you haven’t installed the Angular CLI, you can do so using the following command:

npm install -g @angular/cli

2.2 Creating a New Angular Project

Let’s create a new Angular project using the Angular CLI:

ng new angular-form-array-tutorial
cd angular-form-array-tutorial

Section 3: Creating a Reactive Form with FormArray

3.1 Generating a Component

To keep things organized, let’s generate a new component for our form:

ng generate component form-array-example

3.2 Importing Necessary Modules

Open the form-array-example.component.ts file and import the required modules:

// form-array-example.component.ts

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';

@Component({
selector: 'app-form-array-example',
templateUrl: './form-array-example.component.html',
styleUrls: ['./form-array-example.component.css']
})
export class FormArrayExampleComponent implements OnInit {

myForm: FormGroup;

constructor(private fb: FormBuilder) { }

ngOnInit(): void {
this.myForm = this.fb.group({
items: this.fb.array([]) // Initialize an empty FormArray
});
}

// Other form-related methods will go here

}

3.3 Basic Form Structure

Now, let’s create a simple form structure in the form-array-example.component.html file:

<!-- form-array-example.component.html -->

<form [formGroup]="myForm">
<!-- Form controls go here -->
</form>

Section 4: Adding Form Controls Dynamically

4.1 Creating the Add Item Method

In the form-array-example.component.ts file, let's create a method to add form controls dynamically. We'll call it addItem:

// form-array-example.component.ts

addItem() {
const item = this.fb.group({
// Define your form controls here
});

// Add the new form group to the FormArray
this.items.push(item);
}

// Helper method to get the 'items' FormArray
get items() {
return this.myForm.get('items') as FormArray;
}

4.2 Adding a Button in the HTML

In your component’s HTML (form-array-example.component.html), add a button to trigger the addItem method:

<!-- form-array-example.component.html -->

<button (click)="addItem()">Add Item</button>

4.3 Customizing Form Controls

Extend the addItem method to include some form control customization. For example, let's add a 'name' and 'quantity' field with validation:

// form-array-example.component.ts

addItem() {
const item = this.fb.group({
name: ['', Validators.required],
quantity: [1, [Validators.required, Validators.min(1)]],
// Add more form controls as needed
});

this.items.push(item);
}

Now, your form controls have validation rules. Feel free to customize them based on your requirements.

Section 5: Validating FormArray

5.1 Importance of Validation

Validation is crucial for any form. Let’s add some basic validation to our form controls. Update the addItem method to include validators:

// form-array-example.component.ts

addItem() {
const item = this.fb.group({
name: ['', Validators.required],
quantity: [1, [Validators.required, Validators.min(1)]],
// Add more form controls as needed
});

this.items.push(item);
}

5.2 Customizing Validation Rules

Customize the validation rules based on your specific needs. Validators such as Validators.required and Validators.min are just examples. You can add more complex validation logic as necessary.

Section 6: Working with Nested FormArrays

6.1 Introduction to Nested FormArrays

In real-world scenarios, you might encounter situations where you need nested FormArrays. For example, each item might have a list of sub-items. Let’s extend our example to include a nested FormArray:

// form-array-example.component.ts

ngOnInit(): void {
this.myForm = this.fb.group({
items: this.fb.array([
this.fb.group({
name: ['', Validators.required],
quantity: [1, [Validators.required, Validators.min(1)]],
subItems: this.fb.array([]) // Nested FormArray
})
])
});
}

// Helper method to get the 'subItems' FormArray inside an 'item'
getSubItems(itemIndex: number) {
return (this.items.at(itemIndex) as FormGroup).get('subItems') as FormArray;
}

addSubItem(itemIndex: number) {
const subItem = this.fb.group({
// Define your sub-item form controls here
});

// Add the new sub-item form group to the nested FormArray
this.getSubItems(itemIndex).push(subItem);
}

6.2 Updating the HTML Structure

In your HTML, update the structure to accommodate the nested FormArray:

<!-- form-array-example.component.html -->

<div *ngFor="let item of items.controls; let i = index">
<div>
<label>Item {{ i + 1 }}:</label>
<input formControlName="name" placeholder="Name">
<input formControlName="quantity" placeholder="Quantity">
<button (click)="addSubItem(i)">Add Sub-Item</button>
</div>

<div formArrayName="subItems">
<div *ngFor="let subItem of getSubItems(i).controls; let j = index">
<!-- Display sub-item controls here -->
</div>
</div>
</div>

This completes our in-depth tutorial on Angular FormArray implementation. You’ve learned how to set up a reactive form.

Thanks for reading!

I hope you found this article useful. If you have any questions or suggestions, please leave comments. Your feedback helps me to become better.

Don’t forget to subscribe⭐️

Facebook Page: https://www.facebook.com/designTechWorld1

Instagram Page: https://www.instagram.com/techd.esign/

Youtube Channel: https://www.youtube.com/@tech..Design/

Twitter: https://twitter.com/sumit_singh2311

--

--

Sumit kumar Singh
Frontend Weekly

YouTube: https://www.youtube.com/@tech..Design/ 📚 HTML,Angular, React,and JavaScript 🧑‍💻 Tips & tricks on Web Developing 👉 FULL STACK DEVELOPER