← Back to Articles         
Template-Driven vs Reactive Forms in Angular

Template-Driven vs Reactive Forms in Angular

Published on 01 Oct 2026     6 min read Angular
Angular forms

Template-Driven vs Reactive Forms in Angular

Both are used to collect, validate, and submit user input, but the major difference is where and how the form model is managed.

Template-Driven: Form logic is mainly defined in HTML using ngModel.
Reactive: Form model and validation are mainly defined in TypeScript using FormGroup and FormControl.


1. Main Difference

Template-Driven Form

HTML Template
     ↓
ngModel / validation attributes
     ↓
Angular creates and manages form controls
     ↓
Component

Example:

<input
  name="name"
  [(ngModel)]="user.name"
  required>

Reactive Form

TypeScript
     ↓
FormGroup / FormControl / Validators
     ↓
Explicit form model
     ↓
HTML Template

TypeScript:

userForm = new FormGroup({
  name: new FormControl('', Validators.required)
});

HTML:

<input formControlName="name">

2. Template-Driven vs Reactive Forms

Feature Template-Driven Reactive
Form definition Mainly HTML Mainly TypeScript
Module FormsModule ReactiveFormsModule
Main API ngModel FormControl, FormGroup
Form creation Angular largely creates it from template directives Developer explicitly creates it
Data binding [(ngModel)] Form model/directives
Validation Template attributes Validators in TypeScript
Code style Template-centric Model/programmatic
Simple forms Very convenient Can be more code
Complex forms Can become harder to maintain Well suited
Dynamic forms More difficult Easier
Unit testing Less convenient Easier
Programmatic control Less explicit Strong
FormArray No direct equivalent in template-driven API Supported
Best suited for Small/simple forms Medium/complex forms

3. Full Simple Example – Template-Driven

app.ts

import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [FormsModule],
  templateUrl: './app.html'
})
export class App {

  user = {
    name: '',
    email: ''
  };

  submitForm() {
    console.log(this.user);
  }
}

app.html

<h2>Template-Driven Form</h2>

<form #userForm="ngForm"
      (ngSubmit)="submitForm()">

  <div>
    <label>Name:</label>

    <input
      type="text"
      name="name"
      [(ngModel)]="user.name"
      required>
  </div>

  <br>

  <div>
    <label>Email:</label>

    <input
      type="email"
      name="email"
      [(ngModel)]="user.email"
      required
      email>
  </div>

  <br>

  <button
    type="submit"
    [disabled]="userForm.invalid">

    Submit

  </button>

</form>

What is happening?

The important code is in the HTML:

[(ngModel)]="user.name"

and:

required

Angular uses these template directives/attributes to manage the controls and validation.


4. Full Simple Example – Reactive Form

app.ts

import { Component } from '@angular/core';
import {
  FormControl,
  FormGroup,
  ReactiveFormsModule,
  Validators
} from '@angular/forms';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ReactiveFormsModule],
  templateUrl: './app.html'
})
export class App {

  userForm = new FormGroup({

    name: new FormControl('', [
      Validators.required
    ]),

    email: new FormControl('', [
      Validators.required,
      Validators.email
    ])

  });

  submitForm() {

    if (this.userForm.valid) {
      console.log(this.userForm.value);
    }

  }
}

app.html

<h2>Reactive Form</h2>

<form
  [formGroup]="userForm"
  (ngSubmit)="submitForm()">

  <div>
    <label>Name:</label>

    <input
      type="text"
      formControlName="name">
  </div>

  <br>

  <div>
    <label>Email:</label>

    <input
      type="email"
      formControlName="email">
  </div>

  <br>

  <button
    type="submit"
    [disabled]="userForm.invalid">

    Submit

  </button>

</form>

Here the form definition is primarily in TypeScript:

userForm = new FormGroup({
  name: new FormControl('', Validators.required)
});

The HTML connects to that existing form model:

<form [formGroup]="userForm">

<input formControlName="name">

5. Difference in Validation

This is one of the easiest differences to remember.

Template-Driven

Validation is commonly declared in HTML:

<input
  name="name"
  [(ngModel)]="user.name"
  required
  minlength="3">

Reactive

Validation is commonly declared in TypeScript:

name: new FormControl('', [
  Validators.required,
  Validators.minLength(3)
])

So:

Template-Driven
      ↓
required
minlength="3"
      ↓
HTML


Reactive
      ↓
Validators.required
Validators.minLength(3)
      ↓
TypeScript

6. Difference in Form Model

This is the most important conceptual difference.

Template-Driven

You write:

<form #userForm="ngForm">

<input
  name="name"
  [(ngModel)]="user.name">

</form>

Angular builds the form model from the template directives.

HTML
 ↓
Angular
 ↓
Form model

Reactive

You explicitly create the form model yourself:

userForm = new FormGroup({
  name: new FormControl('')
});

Then connect the template to it:

<form [formGroup]="userForm">

<input formControlName="name">

</form>
TypeScript
 ↓
Form model
 ↓
HTML

7. Dynamic Forms

Suppose you have:

Skills

[C#       ]
[Angular  ]
[SQL      ]

[+ Add Skill]

The user can dynamically add or remove skills.

Reactive Forms provide:

FormArray

which is designed for this scenario.

Conceptually:

FormArray

├── C#
├── Angular
├── SQL
├── Azure
└── ...

This kind of dynamic form manipulation is generally much easier with Reactive Forms.


8. When Should You Use Each?

Template-Driven Forms

Good for straightforward forms such as:

Contact Form

Name
Email
Message
Submit

where validation and dynamic behavior are limited.


Reactive Forms

Useful for more complex forms such as:

Employee Registration

Personal Details
Address
Multiple Phone Numbers
Multiple Skills
Employment History
Conditional fields
Custom validations
Cross-field validations

Here Reactive Forms give you more explicit programmatic control.


9. Easy Way to Remember

Template-Driven

HTML is the main driver

HTML
 ↓
ngModel
 ↓
Angular Form

Reactive

TypeScript is the main driver

TypeScript
 ↓
FormGroup
 ↓
FormControl
 ↓
HTML

Or simply:

Template-Driven = HTML-centric

Reactive        = TypeScript/model-centric

10. Key Points

  • Angular supports Template-Driven and Reactive forms.
  • Template-Driven Forms use FormsModule.
  • Reactive Forms use ReactiveFormsModule.
  • Template-Driven Forms commonly use [(ngModel)].
  • Reactive Forms use FormControl, FormGroup, and FormArray.
  • Template-Driven validation is commonly defined in HTML.
  • Reactive validation is commonly defined using Validators in TypeScript.
  • Angular derives much of the Template-Driven form model from template directives.
  • Reactive Forms use an explicitly created form model.
  • Template-Driven Forms are convenient for simpler forms.
  • Reactive Forms provide stronger programmatic control for complex and dynamic forms.
  • Reactive Forms are generally easier to unit test because the form model exists directly in TypeScript.

11. Interview Questions and Answers

1. What is the main difference between Template-Driven and Reactive Forms?

Template-Driven Forms are primarily defined through HTML template directives, while Reactive Forms use an explicit form model in TypeScript.


2. Which module is used for Template-Driven Forms?

FormsModule

3. Which module is used for Reactive Forms?

ReactiveFormsModule

4. What does Template-Driven Form use for binding?

It commonly uses:

[(ngModel)]

Example:

<input
  name="name"
  [(ngModel)]="name">

5. What does Reactive Form use?

Reactive Forms primarily use:

FormControl
FormGroup
FormArray
Validators

6. Which is better for simple forms?

Template-Driven Forms are often convenient for simple forms because they require relatively little TypeScript form setup.


7. Which is better for complex forms?

Reactive Forms are usually a stronger fit because they provide explicit control over the form model, validation, dynamic controls, and testing.


8. Which is easier for dynamic forms?

Reactive Forms, especially because they provide APIs such as:

FormArray

for dynamically adding and removing controls.


9. Which is easier to unit test?

Reactive Forms are generally easier to test because the form model and validation logic can be tested directly from TypeScript.


10. Can both approaches perform validation?

Yes.

Template-Driven:

required
minlength="3"

Reactive:

Validators.required
Validators.minLength(3)

Interview Answer

Template-Driven Forms are HTML-centric and use FormsModule, ngForm, and ngModel, with Angular deriving the form model from template directives. Reactive Forms are model-centric and use ReactiveFormsModule, FormGroup, FormControl, and Validators, with the form model explicitly defined in TypeScript. Template-Driven Forms are convenient for simple forms, while Reactive Forms provide more programmatic control for complex and dynamic forms.

← Back to Articles