Data binding is one of the most important and powerful features in Angular, which allows us to define communication between the component and view or template. In Angular 21, Signals are the modern reactive primitive that work seamlessly with all data binding types. There are mainly four types of data binding available in Angular, such as-
Renders a component property value into the template using double curly braces {{ }}. Works with both plain properties and signals.
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-root',
standalone: true,
template: `
<h1>{{ title() }}</h1>
<p>2 + 2 = {{ 2 + 2 }}</p>
<p>{{ greeting.toUpperCase() }}</p>
`
})
export class AppComponent {
title = signal('Angular 21');
greeting = 'hello world';
}
Binds a component property to a DOM element property using square brackets [ ]. Flows data from component to template.
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-root',
standalone: true,
template: `
<img [src]="logoUrl" [alt]="logoAlt" />
<button [disabled]="isDisabled()">Submit</button>
<p [class.highlight]="isActive">Highlighted text</p>
`,
styles: ['.highlight { background: yellow; }']
})
export class AppComponent {
logoUrl = 'https://angular.io/assets/images/logos/angular/angular.svg';
logoAlt = 'Angular Logo';
isDisabled = signal(false);
isActive = true;
}
Listens to DOM events using parentheses ( ). Flows data from template to component.
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-root',
standalone: true,
template: `
<button (click)="increment()">Click me</button>
<p>Clicked {{ count() }} times</p>
<input (keyup.enter)="onEnter($event)" placeholder="Press Enter" />
`
})
export class AppComponent {
count = signal(0);
increment() { this.count.update(c => c + 1); }
onEnter(event: Event) {
console.log((event.target as HTMLInputElement).value);
}
}
Combines property and event binding using [(ngModel)] (requires FormsModule) or the modern model() signal for component-to-component two-way binding.
import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-root',
standalone: true,
imports: [FormsModule],
template: `
<h2>Welcome: {{ userName }}</h2>
<input type="text" [(ngModel)]="userName" placeholder="Enter your name" />
`
})
export class AppComponent {
userName = 'Angular';
}
Angular 21 uses Signals as the primary reactive primitive. Signals provide a simpler and more efficient way to manage state compared to traditional change detection:
Signals work seamlessly with all four data binding types and enable zoneless change detection.
Explore 500+ free tutorials across 20+ languages and frameworks.