DEV Community

Cover image for Building Dynamic Forms in Angular
bytebantz
bytebantz

Posted on

Building Dynamic Forms in Angular

In Angular applications, forms are a fundamental aspect of collecting and managing user input. While static forms are common, there are scenarios where you need to create dynamic forms that adapt to user interactions, such as adding or removing form fields dynamically. In this article, we’ll explore how to build dynamic forms in Angular using the FormArray class, with step-by-step technical examples

1. Importing the FormArray Class

To start building dynamic forms in Angular, we first need to import the FormArray class from the @angular/forms module. The FormArray class provides us with the tools necessary to manage an array of form controls dynamically.

import { FormArray, FormBuilder, ReactiveFormsModule } from '@angular/forms';
Enter fullscreen mode Exit fullscreen mode

2. Defining a FormArray Control

Next, we define a FormArray control within our main FormGroup. This FormArray will hold the dynamically added form controls, such as input fields or other form elements.

export class ProfileEditorComponent {
  // Initialize FormGroup with FormArray
  profileForm: FormGroup;

  // Constructor to initialize FormBuilder
  constructor(private formBuilder: FormBuilder) {
    this.profileForm = this.formBuilder.group({
      favoriteBooks: this.formBuilder.array([this.formBuilder.control('')])
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

3. Accessing the FormArray Control

We create a getter method to access the FormArray control defined in our FormGroup. This getter method allows us to interact with the FormArray in our component logic.

get favoriteBooks() {
  return this.profileForm.get('favoriteBooks') as FormArray;
}
Enter fullscreen mode Exit fullscreen mode

this.profileForm.get(‘favoriteBooks’) returns an AbstractControl, but we explicitly cast it to a FormArray using as FormArray. Now, whenever we call this.favoriteBooks, it will execute this getter method, which in turn retrieves the FormArray control for us.

In essence, the get favoriteBooks() method acts as a convenient and consistent way to access the favoriteBooks FormArray control within the component. It abstracts away the complexity of accessing the control directly and promotes encapsulation and code readability.

3. Displaying the FormArray in the Template

In the HTML template file, we use the formArrayName directive to bind the FormArray to the template. We then use *ngFor to loop through each form control in the FormArray and display the corresponding form fields dynamically.

<div formArrayName="favoriteBooks">
  <h2>Favorite Books</h2>
  <button type="button" (click)="addBook()">Add Book</button>
  <div *ngFor="let book of favoriteBooks.controls; let i=index">
    <label for="book-{{ i }}">Book {{ i + 1 }}:</label>
    <input id="book-{{ i }}" type="text" [formControlName]="i">
    <button (click)="removeBook(i)">Delete book </button>
  </div>
</div>
Enter fullscreen mode Exit fullscreen mode

4. Adding a Method to Dynamically Insert Controls

Now, we implement a method to add new form controls dynamically to the FormArray. This method is called when the user interacts with the form, such as clicking a button to add a new form field.

addBook() {
  this.favoriteBooks.push(this.formBuilder.control(''));
}
Enter fullscreen mode Exit fullscreen mode

5. Adding a Method to Dynamically Delete Controls

Finally, we implement a method to delete a form control. This method is called when the user clicks a button to delete the form field.

removeBook(index: number) {
    this.favoriteBooks.removeAt(index)
  }
Enter fullscreen mode Exit fullscreen mode

Conclusion

Dynamic forms provide a flexible and user-friendly way to collect data in Angular applications. By leveraging the FormArray class, developers can create forms that adapt to various user inputs dynamically. With the step-by-step examples provided in this article, you can confidently build dynamic forms in your Angular projects, enhancing the user experience and usability of your applications.

To get the rest of the code check the following links:
https://github.com/anthony-kigotho/angular-forms

CTA

💛If you enjoy my articles, consider subscribing to my newsletter to receive my new articles by email

Top comments (0)