DEV Community

Cover image for Mastering Angular: A Comprehensive Guide to ReactiveForms Filtering
chintanonweb
chintanonweb

Posted on

Mastering Angular: A Comprehensive Guide to ReactiveForms Filtering

Filtering through FormControls/FormGroups in a ReactiveForm with Angular

Introduction

Angular's Reactive Forms provide a powerful way to manage form inputs and their validation in a reactive and predictable manner. When it comes to filtering form inputs dynamically, leveraging Angular's FormControl and FormGroup classes can be immensely beneficial. In this article, we'll explore how to effectively filter through FormControls and FormGroups in a ReactiveForm in Angular, covering various scenarios and providing detailed examples.

Setting up the Environment

Before we delve into filtering through FormControls and FormGroups, let's ensure our environment is properly set up for Angular development. Make sure you have Node.js and npm installed on your system. If not, you can download and install them from the official Node.js website.

Once Node.js and npm are installed, you can proceed to install Angular CLI globally by running the following command in your terminal or command prompt:

npm install -g @angular/cli
Enter fullscreen mode Exit fullscreen mode

With Angular CLI installed, we can create a new Angular project by running the following command:

ng new angular-filtering-forms
Enter fullscreen mode Exit fullscreen mode

Navigate into the project directory:

cd angular-filtering-forms
Enter fullscreen mode Exit fullscreen mode

Creating a ReactiveForm

Now that our project is set up, let's create a ReactiveForm to work with. We'll start by generating a new component where we'll define our form.

ng generate component user-form
Enter fullscreen mode Exit fullscreen mode

Once the component is generated, open the newly created user-form.component.ts file and import the necessary modules:

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

@Component({
  selector: 'app-user-form',
  templateUrl: './user-form.component.html',
  styleUrls: ['./user-form.component.css']
})
export class UserFormComponent implements OnInit {
  userForm: FormGroup;

  constructor(private formBuilder: FormBuilder) { }

  ngOnInit(): void {
    this.userForm = this.formBuilder.group({
      username: ['', Validators.required],
      email: ['', [Validators.required, Validators.email]],
      age: ['', Validators.required]
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

In the above code, we've imported FormBuilder, FormGroup, and Validators from @angular/forms. We've then defined a FormGroup called userForm, containing FormControls for username, email, and age with their respective validation rules.

Filtering FormControls

Now, let's say we want to filter the input for the username field to only allow alphanumeric characters. We can achieve this by adding a custom validator to the username FormControl.

First, let's create a custom validator function:

function alphanumericValidator(control: FormControl): { [key: string]: any } | null {
  const valid = /^[a-zA-Z0-9]*$/.test(control.value);
  return valid ? null : { 'invalidAlphanumeric': { value: control.value } };
}
Enter fullscreen mode Exit fullscreen mode

Then, we'll update the FormControl for username to include our custom validator:

ngOnInit(): void {
  this.userForm = this.formBuilder.group({
    username: ['', [Validators.required, alphanumericValidator]],
    email: ['', [Validators.required, Validators.email]],
    age: ['', Validators.required]
  });
}
Enter fullscreen mode Exit fullscreen mode

With this setup, the username field will only accept alphanumeric characters.

Filtering FormGroups

Sometimes, we might need to filter inputs based on the values of other fields in the form. Let's say we want to ensure that the user's age is at least 18 if they provide an email address. We can achieve this by subscribing to value changes in the email FormControl and updating the validation rules for the age FormControl accordingly.

ngOnInit(): void {
  this.userForm = this.formBuilder.group({
    username: ['', [Validators.required, alphanumericValidator]],
    email: ['', [Validators.required, Validators.email]],
    age: ['', Validators.required]
  });

  this.userForm.get('email').valueChanges.subscribe(email => {
    const ageControl = this.userForm.get('age');
    if (email) {
      ageControl.setValidators([Validators.required, Validators.min(18)]);
    } else {
      ageControl.setValidators(Validators.required);
    }
    ageControl.updateValueAndValidity();
  });
}
Enter fullscreen mode Exit fullscreen mode

In the above code, we're subscribing to value changes in the email FormControl and updating the validation rules for the age FormControl accordingly.

Conclusion

In this article, we've explored how to filter through FormControls and FormGroups in a ReactiveForm in Angular. By leveraging Angular's FormControl and FormGroup classes, we can create dynamic and responsive forms that adapt to user input. Whether it's applying custom validators to FormControls or updating validation rules based on the values of other fields, Angular's Reactive Forms provide a flexible and powerful way to handle form filtering scenarios. Experiment with these concepts in your Angular projects to create intuitive and user-friendly forms.

Top comments (0)