Introduction
Essentials

Templates

Use Angular's template syntax to create dynamic user interfaces.

Component templates aren't just static HTML— they can use data from your component class and set up handlers for user interaction.

Showing dynamic text

In Angular, a binding creates a dynamic connection between a component's template and its data. This connection ensures that changes to the component's data automatically update the rendered template.

You can create a binding to show some dynamic text in a template by using double curly-braces:

      
@Component({  selector: 'user-profile',  template: `<h1>Profile for {{userName()}}</h1>`,})export class TodoListItem {  userName = signal('pro_programmer_123');}

When Angular renders the component, you see:

      
<h1>Profile for pro_programmer_123</h1>

Angular automatically keeps the binding up-to-date when the value of the signal changes. Building on the example above, if we update the value of the userName signal:

      
this.userName.set('cool_coder_789');

The rendered page updates to reflect the new value:

      
<h1>Profile for cool_coder_789</h1>

Setting dynamic properties and attributes

Angular supports binding dynamic values into DOM properties with square brackets:

      
@Component({  /*...*/  // Set the `disabled` property of the button based on the value of `isValidUserId`.  template: `<button [disabled]="isValidUserId()">Save changes</button>`,})export class UserProfile {  isValidUserId = signal(false);}

You can also bind to HTML attributes by prefixing the attribute name with attr.:

      
<!-- Bind the `role` attribute on the `<ul>` element to value of `listRole`. --><ul [attr.role]="listRole()">

Angular automatically updates DOM properties and attribute when the bound value changes.

Handling user interaction

Angular lets you add event listeners to an element in your template with parentheses:

      
@Component({  /*...*/  // Add an 'click' event handler that calls the `cancelSubscription` method.   template: `<button (click)="cancelSubscription()">Cancel subscription</button>`,})export class UserProfile {  /* ... */    cancelSubscription() { /* Your event handling code goes here. */  }}

If you need to pass the event object to your listener, you can use Angular's built-in $event variable inside the function call:

      
@Component({  /*...*/  // Add an 'click' event handler that calls the `cancelSubscription` method.   template: `<button (click)="cancelSubscription($event)">Cancel subscription</button>`,})export class UserProfile {  /* ... */    cancelSubscription(event: Event) { /* Your event handling code goes here. */  }}

Control flow with @if and @for

You can conditionally hide and show parts of a template with Angular's @if block:

      
<h1>User profile</h1>@if (isAdmin()) {  <h2>Admin settings</h2>  <!-- ... -->}

The @if block also supports an optional @else block:

      
<h1>User profile</h1>@if (isAdmin()) {  <h2>Admin settings</h2>  <!-- ... -->} @else {  <h2>User settings</h2>  <!-- ... -->  }

You can repeat part of a template multiple times with Angular's @for block:

      
<h1>User profile</h1><ul class="user-badge-list">  @for (badge of badges(); track badge.id) {    <li class="user-badge">{{badge.name}}</li>  }</ul>

Angular's uses the track keyword, shown in the example above, to associate data with the DOM elements created by @for. See Why is track in @for blocks important? for more info.

Tip: Want to know more about Angular templates? See the In-depth Templates guide for the full details.

Next Step

Now that you have dynamic data and templates in the application, it's time to learn how to enhance templates by conditionally hiding or showing certain elements, looping over elements, and more.