In this tutorial, we are going to see how to use the Angular Reactive forms approach to create advanced forms.
In Angular, we can use two different approaches to create forms.
The template-driven forms and the reactive-forms.
In the template-driven form, we find all the validations and logic inside the HTML template whereas in the reactive forms we find everything inside the component (form creation, validations … ).
So, Angular Reactive forms approach is very recommended if we want to create advanced and complex forms.
Table of Contents
What is Angular Reactive Forms Approach ?
Angular reactive forms is an approach where we build the form directly in the component file.
Using this approach, we can create our form structure using formGroup, fromControl and formArray, and we use them through the formBuilder module to build the form (optional).
Unlike the template-driven forms, all the validation rules are defined in the component file when we create the form structure.
How to use Angular Reactive Forms Approach ?
To use angular reactive forms, we need first to import the ReactiveFormsModule
in your component module (exp : appModule
).
Then, we can create the form structure using the formGroup , the formControl and the formArray depending on your needs.
Finally, you create the HTML template and make the same form structure that was created in the component file.
How to Import ReactiveFormsModule ?
The first thing to do, when we use the reactive forms approach to build out forms, is the import of the ReactiveFormsModule
in the component module.
It’s recommended to import the ReactiveFormsModule
in the shared module if we have one.
Otherwise we try to import it in a root module, which prevents us from importing the same module multiple times in the project.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import {ReactiveFormsModule} from "@angular/forms";
import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ReactiveFormsModule,
BrowserAnimationsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Create The Form Model
In the reactive forms approach, we manually create the form structure in the component.
To do that, we need to import the @angular/forms
that provides multiple methods to create the form structure.
Generally, an angular Form must contain at least one element.
If we have only one element, we can use the formControl
method that represents a single form element.
Otherwise, we can use the FormGroup method that contains multiple formControl
.
In some cases, when we want to add and remove formControls
and formGroups
dynamically, we need to use the formArray method.
the formArray represents an array of fromControl
or formGroup
, that means, w can push, remove and access to any formArray
element based on the element index like any regular array.
import {Component, OnInit} from '@angular/core';
import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'XperTuto.com : Angular Reactive forms Approach';
userForm: FormGroup = new FormGroup({});
constructor(private formBuilder: FormBuilder) {
}
ngOnInit() {
this.initializeForm();
}
initializeForm(): void {
this.userForm = this.formBuilder.group({
pseudo: new FormControl('XperTuto', Validators.required),
name: new FormControl('Aouidane', Validators.required),
age: new FormControl(''),
email: new FormControl(''),
});
}
}
Build The HTML Template
Till now, we have the model structure of our form that was created in the component file. Now we need to create the HTML template.
In the template, we will start by creating a regular HTML form, and we will see how to bind it in the next step.
Note that im using the Angular Material
in my example to style the HTML form, it’s optional , so you can use the regular HTML from elements with no problems.
How To Bind The Template To The Model ?
The regular HTML form in angular means nothing if there is no binding between the HTML form and the model.
- To bind the formGroup : we need to use the
[formGroup]
directive and assign it to the model that was created in the component. - To bind the formControl : we need to add the
formControlName
directive and assign it to the control name in the model. - To bind the nested formGroup: we need to add the
formGroupName
directive and assign it to the nestedformGroup
name in the model
Submit The Form
To submit the form and get the form data in the component, we can use two methods :
The first method is based on event binding
, we just add the ngSubmit
directive and assign it to the function in the component.
In the function, we can access the form data using the object in the parameter.
The second method is to use a simple button that calls a function in the component.
In this function, we can access the form data using the local formGroup model.
check the full Code example and the result :
/*app.component.ts*/
import {Component, OnInit} from '@angular/core';
import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'XperTuto.com : Angular Reactive forms Approach';
userForm: FormGroup = new FormGroup({});
constructor(private formBuilder: FormBuilder) {
}
ngOnInit() {
this.initializeForm();
}
initializeForm(): void {
this.userForm = this.formBuilder.group({
pseudo: new FormControl('XperTuto', Validators.required),
name: new FormControl('Aouidane', Validators.required),
age: new FormControl(''),
email: new FormControl(''),
});
}
adduser() {
// call API
console.log(this.userForm.getRawValue());
}
}
References
Clone The Project
To download and run the example, please follow the steps :
1- Clone the source code from XperTuto git repository using the following command :
git clone https://github.com/www-xperTuto-com/angular_reactive_forms.git
2- Install the node dependencies using NPM command line : npm install
3- Run the application using the following command : ng serve
4- Access to the project through the URL : http://localhost:4200
Read More About Angular Forms :
Recapitulation
In this tutorial, we have seen how to use the angular reactive forms approach to build advanced forms. Also, we have seen different methods and directives provided by angular when we use this approach, and that may help us to decide what approach to use before building a new Angular form.
I hope you enjoy reading this Tutorial.