Angular / Angular Forms and Validation

Creating Custom Validators in Angular

In this tutorial, we'll guide you through the process of creating custom validators in Angular. Custom validators allow you to implement complex validation rules that aren't cover…

Tutorial 5 of 5 5 resources in this section

Section overview

5 resources

Covers creating and validating forms using Angular forms module.

1. Introduction

Goal of the Tutorial

The goal of this tutorial is to teach you how to create custom validators in Angular. We'll guide you through the process of creating and implementing your own custom validators, allowing you to implement complex validation rules that aren't covered by Angular's built-in validators.

What You Will Learn

By the end of this tutorial, you will learn:
- What custom validators are in Angular
- How to create a custom validator
- How to use a custom validator in your Angular forms

Prerequisites

  • Basic understanding of Angular
  • Familiarity with TypeScript and Angular Forms

2. Step-by-Step Guide

In Angular, we can create custom validators by creating a function that takes a FormControl instance and returns an error object (if the control is invalid) or null (if the control is valid).

Creating a Custom Validator

Let's create a simple custom validator that checks if the input is a positive number.

import { AbstractControl, ValidatorFn } from '@angular/forms';

// Custom Validator Function
export function PositiveNumberValidator(): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    const isNotPositive = control.value <= 0;
    return isNotPositive ? {notPositive: {value: control.value}} : null;
  };
}

Here, PositiveNumberValidator is a function that returns a function (ValidatorFn). Inside the ValidatorFn, we check if the control's value is not positive. If it's not, we return an error object {notPositive: {value: control.value}}, otherwise we return null.

Using a Custom Validator

We can now use our custom validator in our form controls. Here's an example:

import { FormBuilder, Validators } from '@angular/forms';
import { PositiveNumberValidator } from './validators';

// Form Initialization
this.form = this.fb.group({
  price: ['', [Validators.required, PositiveNumberValidator()]],
});

In this example, we used the PositiveNumberValidator in the price control. So the price must be a positive number.

3. Code Examples

Here are some more practical examples:

Example 1: Email Validator

This custom validator will check if the input is a valid email address.

// Custom Email Validator
export function EmailValidator(): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    const validEmail = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/.test(control.value);
    return !validEmail ? {invalidEmail: {value: control.value}} : null;
  };
}

Example 2: Password Strength Validator

This custom validator will check if the password is strong.

// Password Strength Validator
export function PasswordStrengthValidator(): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    const strongPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/.test(control.value);
    return !strongPassword ? {weakPassword: {value: control.value}} : null;
  };
}

4. Summary

In this tutorial, we've learned how to create and use custom validators in Angular. We've created a simple positive number validator, an email validator, and a password strength validator. The next step is to learn about async validators, which allow you to validate data against a server.

5. Practice Exercises

  1. Exercise 1: Create a custom validator that checks if a string has at least one uppercase letter, one lowercase letter, and one number.
  2. Exercise 2: Create a custom validator that checks if a number is within the range of 1 to 100.
  3. Exercise 3: Create a custom validator that checks if an input is a valid URL.

Solutions
1. Solution 1:

export function AlphaNumericValidator(): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    const isValid = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]+$/.test(control.value);
    return !isValid ? {invalidInput: {value: control.value}} : null;
  };
}
  1. Solution 2:
export function RangeValidator(): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    const isInRange = control.value >= 1 && control.value <= 100;
    return !isInRange ? {outOfRange: {value: control.value}} : null;
  };
}
  1. Solution 3:
export function UrlValidator(): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    const isValid = /^(http|https):\/\/[^ "]+$/.test(control.value);
    return !isValid ? {invalidUrl: {value: control.value}} : null;
  };
}

Remember, practice is key to mastering a concept. So, keep practicing and happy coding!

Need Help Implementing This?

We build custom systems, plugins, and scalable infrastructure.

Discuss Your Project

Related topics

Keep learning with adjacent tracks.

View category

HTML

Learn the fundamental building blocks of the web using HTML.

Explore

CSS

Master CSS to style and format web pages effectively.

Explore

JavaScript

Learn JavaScript to add interactivity and dynamic behavior to web pages.

Explore

Python

Explore Python for web development, data analysis, and automation.

Explore

SQL

Learn SQL to manage and query relational databases.

Explore

PHP

Master PHP to build dynamic and secure web applications.

Explore

Popular tools

Helpful utilities for quick tasks.

Browse tools

Time Zone Converter

Convert time between different time zones.

Use tool

EXIF Data Viewer/Remover

View and remove metadata from image files.

Use tool

Interest/EMI Calculator

Calculate interest and EMI for loans and investments.

Use tool

Timestamp Converter

Convert timestamps to human-readable dates.

Use tool

Countdown Timer Generator

Create customizable countdown timers for websites.

Use tool

Latest articles

Fresh insights from the CodiWiki team.

Visit blog

AI in Drug Discovery: Accelerating Medical Breakthroughs

In the rapidly evolving landscape of healthcare and pharmaceuticals, Artificial Intelligence (AI) in drug dis…

Read article

AI in Retail: Personalized Shopping and Inventory Management

In the rapidly evolving retail landscape, the integration of Artificial Intelligence (AI) is revolutionizing …

Read article

AI in Public Safety: Predictive Policing and Crime Prevention

In the realm of public safety, the integration of Artificial Intelligence (AI) stands as a beacon of innovati…

Read article

AI in Mental Health: Assisting with Therapy and Diagnostics

In the realm of mental health, the integration of Artificial Intelligence (AI) stands as a beacon of hope and…

Read article

AI in Legal Compliance: Ensuring Regulatory Adherence

In an era where technology continually reshapes the boundaries of industries, Artificial Intelligence (AI) in…

Read article

Need help implementing this?

Get senior engineering support to ship it cleanly and on time.

Get Implementation Help