Setup

Go back to Tutorial

Create a new project named angular-tour-of-heroes. The file structure should be as

Keep the app transpiling and running

Enter the following command in the terminal window: npm start

This command runs the TypeScript compiler in “watch mode”, recompiling automatically when the code changes. The command simultaneously launches the app in a browser and refreshes the browser when the code changes.

You can keep building the Tour of Heroes without pausing to recompile or refresh the browser.

Show the hero

Add two properties to the AppComponent: a title property for the app name and a hero property for a hero named “Windstorm.”

app.component.ts (AppComponent class)

export class AppComponent {

title = ‘Tour of Heroes’;

hero = ‘Windstorm’;

}

Now update the template in the @Component decorator with data bindings to these new properties.

app.component.ts (@Component)

template: `<h1>{{title}}</h1><h2>{{hero}} details!</h2>`

The browser refreshes and displays the title and hero name. The double curly braces are Angular’s interpolation binding syntax. These interpolation bindings present the component’s title and hero property values, as strings, inside the HTML header tags.

Hero object

The hero needs more properties. Convert the hero from a literal string to a class. Create a Hero class with id and name properties. Add these properties near the top of the app.component.ts file, just below the import statement.

src/app/app.component.ts (Hero class)

export class Hero {

id: number;

name: string;

}

In the AppComponent class, refactor the component’s hero property to be of type Hero, then initialize it with an id of 1 and the name Windstorm.

src/app/app.component.ts (hero property)

hero: Hero = {

id: 1,

name: ‘Windstorm’

};

Because you changed the hero from a string to an object, update the binding in the template to refer to the hero’s name property.

src/app/app.component.ts

template: `<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>`

The browser refreshes and continues to display the hero’s name.

Adding HTML with multi-line template strings

To show all of the hero’s properties, add a <div> for the hero’s id property and another <div> for the hero’s name. To keep the template readable, place each <div> on its own line.

The backticks around the component template let you put the <h1>, <h2>, and <div> elements on their own lines, thanks to the template literals feature in ES2015 and TypeScript.

app.component.ts (AppComponent’s template)

template: `

<h1>{{title}}</h1>

<h2>{{hero.name}} details!</h2>

<div><label>id: </label>{{hero.id}}</div>

<div><label>name: </label>{{hero.name}}</div>

`

Edit the hero name

Users should be able to edit the hero name in an <input> textbox. The textbox should both display the hero’s name property and update that property as the user types.

You need a two-way binding between the <input> form element and the hero.name property. Refactor the hero name in the template so it looks like this:

src/app/app.component.ts

<div>

<label>name: </label>

<input [(ngModel)]=”hero.name” placeholder=”name”>

</div>

[(ngModel)] is the Angular syntax to bind the hero.name property to the textbox. Data flows in both directions: from the property to the textbox, and from the textbox back to the property.

Unfortunately, immediately after this change, the application breaks. If you looked in the browser console, you’d see Angular complaining that “ngModel … isn’t a known property of input.”

Although NgModel is a valid Angular directive, it isn’t available by default. It belongs to the optional FormsModule. You must opt-in to using that module.

Import the FormsModule

Open the app.module.ts file and import the FormsModule symbol from the @angular/forms library. Then add the FormsModule to the @NgModule metadata’s imports array, which contains the list of external modules that the app uses. The updated AppModule looks like this:

app.module.ts (FormsModule import)

import { NgModule }      from ‘@angular/core’;

import { BrowserModule } from ‘@angular/platform-browser’;

import { FormsModule }   from ‘@angular/forms’; // <– NgModel lives here

import { AppComponent }  from ‘./app.component’;

@NgModule({

imports: [

BrowserModule,

FormsModule // <– import the FormsModule before binding with [(ngModel)]

],

declarations: [

AppComponent

],

bootstrap: [ AppComponent ]

})

export class AppModule { }

When the browser refreshes, the app should work again. You can edit the hero’s name and see the changes reflected immediately in the <h2> above the textbox.

Summary

Take stock of what you’ve built.

  • The Tour of Heroes app uses the double curly braces of interpolation (a type of one-way data binding) to display the app title and properties of a Hero object.
  • You wrote a multi-line template using ES2015’s template literals to make the template readable.
  • You added a two-way data binding to the <input> element using the built-in ngModel directive. This binding both displays the hero’s name and allows users to change it.
  • The ngModel directive propagates changes to every other binding of the hero.name.

Here’s the complete app.component.ts as it stands now:

src/app/app.component.ts

import { Component } from ‘@angular/core’;

export class Hero {

id: number;

name: string;

}

@Component({

selector: ‘my-app’,

template: `

<h1>{{title}}</h1>

<h2>{{hero.name}} details!</h2>

<div><label>id: </label>{{hero.id}}</div>

<div>

<label>name: </label>

<input [(ngModel)]=”hero.name” placeholder=”name”>

</div>

`

})

export class AppComponent {

title = ‘Tour of Heroes’;

hero: Hero = {

id: 1,

name: ‘Windstorm’

};

}

Next step

In the next tutorial page, you’ll build on the Tour of Heroes app to display a list of heroes. You’ll also allow the user to select heroes and display their details. You’ll learn more about how to retrieve lists and bind them to the template.

Go back to Tutorial

What you’ll build
Finding Faults Early

Get industry recognized certification – Contact us

keyboard_arrow_up
Open chat
Need help?
Hello 👋
Can we help you?