Users Pricing

articles

home / developersection / articles / form validation and request submission in angular js
Form validation and request submission in angular js

Form validation and request submission in angular js

Anubhav Sharma 815 16 May 2024 Updated 23 Oct 2025

Forms and validation are crucial aspects of any web application, and AngularJS provides robust support for handling both. Here's a detailed guide on how to manage forms and validation in AngularJS.

I hope, You know about the HTML form and its uses. There are some changes in your code for angular js.

Create a form with validations –

1. Creating a Form AngularJS provides the ng-form directive to create forms. Here's a basic example:

<div class="container" ng-app="myApp" ng-controller="MySimpleController">
        <h2>AngularJS Form</h2>
        <hr>
        <!-- Create a form  -->
        <form name="userForm" class="row g-3" accept="" method="" novalidate>
            <!-- Create a field for name model -->
            <div class="col-12">
                <label class="form-label fw-bold">Name</label>
                <input type="text" ng-model="user.name" class="form-control" placeholder="Name"
                    autofocus="true" required />
            </div>
            <!-- Create a filed for email model -->
            <div class="col-12">
                <label class="form-label fw-bold">Email</label>
                <input type="email" ng-model="user.email" class="form-control" placeholder="Email"
                    autofocus="true" required />
            </div>
            <!-- Create a field for age model -->
            <div class="col-12">
                <label class="form-label fw-bold">Age</label>
                <input type="number" ng-model="user.age" class="form-control" placeholder="Age"
                    autofocus="true" required />
            </div>
            <!-- Create a field for about model -->
            <div class="col-12">
                <label class="form-label fw-bold">About</label>
                <textarea type="text" ng-model="user.about" class="form-control" placeholder="About"
                    autofocus="true" required></textarea>
            </div>
            <div class="col-12">
                <button class="btn btn-primary" ng-disabled="userForm.$invalid">Submit</button>
            <div>
        </form>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('MySimpleController', function ($scope) {
            $scope.user = { name: '', email: '', age: null, about: '' };
        });
    </script>

2. Adding Validation AngularJS provides built-in validation directives that you can use directly on form elements:

  • required: Ensures the field is not empty.
  • ng-minlength and ng-maxlength: Specifies minimum and maximum length for input.
  • ng-pattern: Validates the input based on a regular expression.
  • type="email": Checks if the input is a valid email.
  • type="number": Ensures the input is a number.
Here’s an extended version of the previous example with additional validations:
    <div class="container" ng-app="myApp" ng-controller="MySimpleController">
        <h2>AngularJS Form</h2>
        <hr>
        <!-- Create a form  -->
        <form name="userForm" class="row g-3" accept="" method="" novalidate>
            <!-- Create a field for name model -->
            <div class="col-12">
                <label class="form-label fw-bold">Name</label>
                <input type="text" id="name" name="name" ng-model="user.name" ng-minlength="3" ng-maxlength="20"
                    class="form-control" placeholder="Name" autofocus="true" required />
                <p class="text-danger">
                    <span ng-show="userForm.name.$error.required && userForm.name.$touched">Name is required.</span>
                    <span ng-show="userForm.name.$error.minlength">Name is too short.</span>
                    <span ng-show="userForm.name.$error.maxlength">Name is too long.</span>
                </p>
            </div>
            <!-- Create a filed for email model -->
            <div class="col-12">
                <label class="form-label fw-bold">Email</label>
                <input type="email" ng-model="user.email" class="form-control" placeholder="Email" autofocus="true"
                    required />
                <p class="text-danger">
                    <span ng-show="userForm.email.$error.required && userForm.email.$touched">Email is required.</span>
                    <span ng-show="userForm.email.$error.email">Invalid email address.</span>
                </p>
            </div>
            <!-- Create a field for age model -->
            <div class="col-12">
                <label class="form-label fw-bold">Age</label>
                <input type="number" id="age" name="age" ng-model="user.age" min="0" max="120" class="form-control"
                    placeholder="Age" autofocus="true" required />
                <p class="text-danger">
                    <span ng-show="userForm.age.$error.required && userForm.age.$touched">Age is required.</span>
                    <span ng-show="userForm.age.$error.min">Age must be at least 0.</span>
                    <span ng-show="userForm.age.$error.max">Age must be at most 120.</span>
                </p>
            </div>
            <!-- Create a field for about model -->
            <div class="col-12">
                <label class="form-label fw-bold">About</label>
                <textarea type="text" id="about" name="about" ng-model="user.about" class="form-control"
                    placeholder="About" autofocus="true" required></textarea>
                <p class="text-danger">
                    <span ng-show="userForm.about.$error.required && userForm.about.$touched">About is required.</span>
                </p>
            </div>

            <div class="col-12">
                <button class="btn btn-primary" ng-disabled="userForm.$invalid">Submit</button>
                <div>
        </form>
    </div>

3. Form State and Validation Classes

AngularJS provides several CSS classes that indicate the state of the form and its fields:

  • ng-valid / ng-invalid: The field is valid/invalid.
  • ng-pristine / ng-dirty: The field has not been modified/modified.
  • ng-touched / ng-untouched: The field has been blurred/never blurred.

You can use these classes to style the form elements based on their state.

<style>
    .ng-invalid.ng-touched {
        border-color: red;
    }
    .ng-valid.ng-touched {
        border-color: green;
    }
</style>

5. Handling Form Submission

When handling form submissions, you typically want to process the data only if the form is valid. You can do this by checking the $valid property of the form.

<div class="container" ng-app="myApp" ng-controller="MySimpleController">
        <h2>AngularJS Form</h2>
        <hr>
        <!-- Create a form  -->
        <form name="userForm" class="row g-3" accept="" method="" ng-submit="submitForm(userForm.$valid)" novalidate>
            <!-- Create a field for name model -->
            <div class="col-12">
                <label class="form-label fw-bold">Name</label>
                <input type="text" id="name" name="name" ng-model="user.name" ng-minlength="3" ng-maxlength="20"
                    class="form-control" placeholder="Name" autofocus="true" ng-pattern="/^[a-zA-Z0-9._-]+$/" required />
                <p class="text-danger">
                    <span ng-show="userForm.name.$error.required && userForm.name.$touched">Name is required.</span>
                    <span ng-show="userForm.name.$error.minlength">Name is too short.</span>
                    <span ng-show="userForm.name.$error.maxlength">Name is too long.</span>
                    <span ng-show="userForm.name.$error.pattern">Invalid name format.</span>
                </p>
            </div>
            <!-- Create a filed for email model -->
            <div class="col-12">
                <label class="form-label fw-bold">Email</label>
                <input type="email" ng-model="user.email" class="form-control" placeholder="Email" autofocus="true"
                    required />
                <p class="text-danger">
                    <span ng-show="userForm.email.$error.required && userForm.email.$touched">Email is required.</span>
                    <span ng-show="userForm.email.$error.email">Invalid email address.</span>
                </p>
            </div>
            <!-- Create a field for age model -->
            <div class="col-12">
                <label class="form-label fw-bold">Age</label>
                <input type="number" id="age" name="age" ng-model="user.age" min="0" max="120" class="form-control"
                    placeholder="Age" autofocus="true" required />
                <p class="text-danger">
                    <span ng-show="userForm.age.$error.required && userForm.age.$touched">Age is required.</span>
                    <span ng-show="userForm.age.$error.min">Age must be at least 0.</span>
                    <span ng-show="userForm.age.$error.max">Age must be at most 120.</span>
                </p>
            </div>
            <!-- Create a field for about model -->
            <div class="col-12">
                <label class="form-label fw-bold">About</label>
                <textarea type="text" id="about" name="about" ng-model="user.about" class="form-control"
                    placeholder="About" autofocus="true" required></textarea>
                <p class="text-danger">
                    <span ng-show="userForm.about.$error.required && userForm.about.$touched">About is required.</span>
                </p>
            </div>

            <div class="col-12">
                <button class="btn btn-primary" ng-disabled="userForm.$invalid">Submit</button>
                <div>
        </form>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('MySimpleController', function ($scope) {
            $scope.user = { name: '', email: '', age: null, about: null };
            $scope.checkUsername = function (value) {
                // Custom validation logic
                if (value) {
                    var isValid = value.match(/^[a-zA-Z0-9._-]+$/);
                    return isValid ? true : false;
                }
                return false;
            };
            $scope.submitForm = function (isValid) {
                if (isValid) {
                    // Process form data
                    alert('Form is valid!');
                } else {
                    alert('Form is invalid!');
                }
            };
        });
    </script>

5. Now add all code in one project

<!doctype html>
<html lang="en" data-ng-app="myApp">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>AngularJS Todo List</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
    <!-- Angurr JS CDN  -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.8.3/angular.min.js"
        integrity="sha512-KZmyTq3PLx9EZl0RHShHQuXtrvdJ+m35tuOiwlcZfs/rE7NZv29ygNA8SFCkMXTnYZQK2OX0Gm2qKGfvWEtRXA=="
        crossorigin="anonymous" referrerpolicy="no-referrer">
        </script>

    <style>
        .ng-invalid.ng-touched {
            border-color: red;
        }

        .ng-valid.ng-touched {
            border-color: green;
        }
    </style>
</head>

<body>
    <div class="container" ng-controller="MySimpleController as sip">
        <h2>AngularJS Form</h2>
        <hr />
        <div>
            <!-- Create a form  -->
            <form name="userForm" class="row g-3" accept="" method="" ng-submit="submitForm(userForm.$valid)"
                novalidate>
                <!-- Hidden fields -->
                <input type="hidden" ng-model="userPost.id" />
                <!-- Create a field for userId model -->
                <div class="col-12">
                    <label class="form-label fw-bold">UserId</label>
                    <input type="number" id="userId" name="userId" ng-model="userPost.userId" class="form-control"
                        placeholder="userId" autofocus="true" required />
                    <p class="text-danger">
                        <span ng-show="userForm.userId.$error.required && userForm.userId.$touched">UserId is
                            required.</span>
                    </p>
                </div>
                <!-- Create a field for name model -->
                <div class="col-12">
                    <label class="form-label fw-bold">Title</label>
                    <input type="text" id="title" name="title" ng-model="userPost.title" ng-minlength="3"
                        ng-maxlength="100" class="form-control" placeholder="Title" autofocus="true"
                        ng-pattern="/^[a-zA-Z0-9._-\s]+$/" required />
                    <p class="text-danger">
                        <span ng-show="userForm.title.$error.required && userForm.title.$touched">Title is
                            required.</span>
                        <span ng-show="userForm.title.$error.minlength">Title is too short.</span>
                        <span ng-show="userForm.title.$error.maxlength">Title is too long.</span>
                        <span ng-show="userForm.title.$error.pattern">Invalid title format.</span>
                    </p>
                </div>
                <!-- Create a field for about model -->
                <div class="col-12">
                    <label class="form-label fw-bold">Body</label>
                    <textarea type="text" id="body" name="body" ng-model="userPost.body" class="form-control"
                        placeholder="Body" autofocus="true" required></textarea>
                    <p class="text-danger">
                        <span ng-show="userForm.body.$error.required && userForm.body.$touched">Body is required.</span>
                    </p>
                </div>

                <div class="col-12">
                    <div class="d-flex justify-content-between flex-column flex-md-row">
                        <div>
                            <button class="btn btn-secondary" type="button" data-ng-click="resetForm()">Reset</button>
                            <button class="btn btn-primary" type="submit"
                                ng-disabled="userForm.$invalid">Submit</button>
                        </div>
                        <div class="d-flex flex-column-reverse  flex-md-row align-items-center">
                            <p class="fw-bold px-2 m-0 my-1 my-md-0"
                                data-ng-bind="filteredPosts.length + ' record found'"></p>
                            <input type="search" data-ng-model="searchText" class="form-control mt-2 mt-md-0 w-auto"
                                placeholder="Search ..." />
                        </div>
                    </div>
                </div>
            </form>
        </div>
        <hr>
        <div class="row row-cols-1 row-cols-md-3 g-3 mb-3">
            <div class="w-100 py-3"
                data-ng-if="(filteredPosts = (Posts | orderBy:'id':true | customFilter:searchText )).length == 0">
                <div class="d-flex justify-content-center fw-bold">
                    <div class="text-center">
                        <p class=" fs-2 ">
                            <span class="me-2">😕</span>
                            No records were found
                        </p>
                        <p class="fw-normal">try somthing new keywords</p>
                    </div>
                </div>
            </div>
            <div class="col" data-ng-repeat="post in filteredPosts">
                <div class="card h-100">
                    <div class="card-header bg-transparent border-success position-relative">
                        <span class="px-2 position-absolute end-0 me-2 " data-post-id="{{post.id}}">
                            <button class="btn btn-link p-0" title="Edit" data-ng-click="editPost(post.id)"> <span
                                    class="bi bi-pencil me-1"></span></button>
                            <button class="btn btn-link p-0" title="Delete" data-ng-click="deletePost(post.id)"> <span
                                    class="bi bi-trash me-1 text-danger"></span></button>
                        </span>
                        <p class=" fw-bold m-0">
                            <span class="bi bi-person me-1"></span>
                            {{post.id}}
                        </p>
                    </div>
                    <div class="card-body">
                        <h5 class="card-title">
                            {{post.title}}
                        </h5>
                        <p class="mb-1">
                            {{post.body}}
                        </p>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
        var app = angular.module('myApp', []);
        // create custom search filter like type any keyword in search box and display in the ui format
        app.filter('customFilter', function () {
            return function (items, searchText) {
                if (!searchText) {
                    return items;
                }
                searchText = searchText.toLowerCase();
                return items.filter(function (item) {
                    return Object.keys(item).some(function (key) {
                        if (typeof item[key] === 'object') {
                            return Object.keys(item[key]).some(function (subKey) {
                                return String(item[key][subKey]).toLowerCase().includes(searchText);
                            });
                        }
                        return String(item[key]).toLowerCase().includes(searchText);
                    });
                });
            };
        });
        app.controller('MySimpleController', ['$scope', function ($scope) {
            $scope.Posts = [{
                "userId": 1,
                "id": 1,
                "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
            },
            {
                "userId": 1,
                "id": 2,
                "title": "qui est esse",
                "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
            },
            {
                "userId": 1,
                "id": 3,
                "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
                "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
            },
            {
                "userId": 1,
                "id": 4,
                "title": "eum et est occaecati",
                "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit"
            },
            {
                "userId": 1,
                "id": 5,
                "title": "nesciunt quas odio",
                "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque"
            },
            {
                "userId": 1,
                "id": 6,
                "title": "dolorem eum magni eos aperiam quia",
                "body": "ut aspernatur corporis harum nihil quis provident sequi\nmollitia nobis aliquid molestiae\nperspiciatis et ea nemo ab reprehenderit accusantium quas\nvoluptate dolores velit et doloremque molestiae"
            },
            {
                "userId": 1,
                "id": 7,
                "title": "magnam facilis autem",
                "body": "dolore placeat quibusdam ea quo vitae\nmagni quis enim qui quis quo nemo aut saepe\nquidem repellat excepturi ut quia\nsunt ut sequi eos ea sed quas"
            },
            {
                "userId": 1,
                "id": 8,
                "title": "dolorem dolore est ipsam",
                "body": "dignissimos aperiam dolorem qui eum\nfacilis quibusdam animi sint suscipit qui sint possimus cum\nquaerat magni maiores excepturi\nipsam ut commodi dolor voluptatum modi aut vitae"
            },
            {
                "userId": 1,
                "id": 9,
                "title": "nesciunt iure omnis dolorem tempora et accusantium",
                "body": "consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas"
            },
            {
                "userId": 1,
                "id": 10,
                "title": "optio molestias id quia eum",
                "body": "quo et expedita modi cum officia vel magni\ndoloribus qui repudiandae\nvero nisi sit\nquos veniam quod sed accusamus veritatis error"
            }];
            $scope.userPostMaster = { title: '', userId: 10, id: 0, body: null };
            $scope.userPost = angular.copy($scope.userPostMaster);

            $scope.getPostById = function (postid) {
                const index = $scope.Posts.findIndex(p => p.id === postid);
                if (index !== -1) {
                    return $scope.Posts[index];
                }
            }

            $scope.getLastPost = function () {
                if (!$scope.Posts || $scope.Posts.length === 0) {
                    return null;
                }
                return $scope.Posts[$scope.Posts.length - 1];
            };


            // Function to submit the form
            $scope.submitForm = function (isValid) {
                if (isValid) {
                    if ($scope.userPost.id) {
                        // Find the index of the updated post
                        const index = $scope.Posts.findIndex(p => p.id === $scope.userPost.id);
                        if (index !== -1) {
                            // Update the post in the array
                            $scope.Posts[index] = angular.copy($scope.userPost);
                        }
                        alert('Post updated successfully!');
                    }
                    else {
                        // Handle the response after successful submission
                        if ($scope.getLastPost() != null) {
                            var newPost = angular.copy($scope.userPost);
                            //console.log(newPost, $scope.getLastPost());
                            newPost.id = $scope.getLastPost().id + 1;
                            $scope.Posts.push(newPost);
                        } else {
                            $scope.userPost.id = 1;
                            $scope.Posts.push($scope.userPost);
                        }
                        alert('Form submitted successfully!');
                    }
                    $scope.resetForm();
                } else {
                    alert('Form is invalid!');
                }
            };

            // Function to delete a post
            $scope.deletePost = function (postId) {
                if (window.confirm("Are you sure, You want to delete this record.")) {
                    // On successful deletion, remove the post from the scope
                    const index = $scope.Posts.findIndex(p => p.id === postId);
                    if (index !== -1) {
                        // Update the post in the array
                        $scope.Posts.splice(index, 1)
                    }
                    alert('Post deleted successfully!');
                }
            };

            // Function to fetch a post by ID for editing
            $scope.editPost = function (postId) {
                $scope.userPost = angular.copy($scope.getPostById(postId));
            };

            // Function to reset the form
            $scope.resetForm = function () {
                // Reset the post model
                $scope.userPost = angular.copy($scope.userPostMaster);
                // Reset form state
                $scope.userForm.$setPristine();
                $scope.userForm.$setUntouched();
            };
        }]);
    </script>
</body>

</html>

Output -

Form validation and request submission in angular js

Read also: https://www.mindstick.com/articles/335818/what-is-a-filter-and-how-to-use-it-in-angularjs-explain-with-an-example

Thank you.


Anubhav Sharma

Student

The Anubhav portal was launched in March 2015 at the behest of the Hon'ble Prime Minister for retiring government officials to leave a record of their experiences while in Govt service .