# The Hero Editor
The application now has a basic title.
Next you will create a new component to display hero information
and place that component in the application shell.
## Create the heroes component
Using the Angular CLI, generate a new component named `heroes`.
ng generate component heroes
The CLI creates a new folder, `src/app/heroes/`, and generates
the three files of the `HeroesComponent`.
The `HeroesComponent` class file is as follows:
You always import the `Component` symbol from the Angular core library
and annotate the component class with `@Component`.
`@Component` is a decorator function that specifies the Angular metadata for the component.
The CLI generated three metadata properties:
1. `selector`— the component's CSS element selector
1. `templateUrl`— the location of the component's template file.
1. `styleUrls`— the location of the component's private CSS styles.
{@a selector}
The [CSS element selector](https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors),
`'app-heroes'`, matches the name of the HTML element that identifies this component within a parent component's template.
The `ngOnInit` is a [lifecycle hook](guide/lifecycle-hooks#oninit).
Angular calls `ngOnInit` shortly after creating a component.
It's a good place to put initialization logic.
Always `export` the component class so you can `import` it elsewhere ... like in the `AppModule`.
### Add a _hero_ property
Add a `hero` property to the `HeroesComponent` for a hero named "Windstorm."
### Show the hero
Open the `heroes.component.html` template file.
Delete the default text generated by the Angular CLI and
replace it with a data binding to the new `hero` property.
## Show the _HeroesComponent_ view
To display the `HeroesComponent`, you must add it to the template of the shell `AppComponent`.
Remember that `app-heroes` is the [element selector](#selector) for the `HeroesComponent`.
So add an `` element to the `AppComponent` template file, just below the title.
Assuming that the CLI `ng serve` command is still running,
the browser should refresh and display both the application title and the hero name.
## Create a Hero class
A real hero is more than a name.
Create a `Hero` class in its own file in the `src/app` folder.
Give it `id` and `name` properties.
Return to the `HeroesComponent` class and import the `Hero` class.
Refactor the component's `hero` property to be of type `Hero`.
Initialize it with an `id` of `1` and the name `Windstorm`.
The revised `HeroesComponent` class file should look like this:
The page no longer displays properly because you changed the hero from a string to an object.
## Show the hero object
Update the binding in the template to announce the hero's name
and show both `id` and `name` in a details layout like this:
The browser refreshes and displays the hero's information.
## Format with the _UppercasePipe_
Modify the `hero.name` binding like this.
The browser refreshes and now the hero's name is displayed in capital letters.
The word `uppercase` in the interpolation binding,
right after the pipe operator ( | ),
activates the built-in `UppercasePipe`.
[Pipes](guide/pipes) are a good way to format strings, currency amounts, dates and other display data.
Angular ships with several built-in pipes and you can create your own.
## Edit the hero
Users should be able to edit the hero name in an `` textbox.
The textbox should both _display_ the hero's `name` property
and _update_ that property as the user types.
That means data flow from the component class _out to the screen_ and
from the screen _back to the class_.
To automate that data flow, setup a two-way data binding between the `` form element and the `hero.name` property.
### Two-way binding
Refactor the details area in the `HeroesComponent` template so it looks like this:
**[(ngModel)]** is Angular's two-way data binding syntax.
Here it binds the `hero.name` property to the HTML textbox so that data can flow _in both directions:_ from the `hero.name` property to the textbox, and from the textbox back to the `hero.name`.
### The missing _FormsModule_
Notice that the app stopped working when you added `[(ngModel)]`.
To see the error, open the browser development tools and look in the console
for a message like
Template parse errors:
Can't bind to 'ngModel' since it 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` and you must _opt-in_ to using it.
## _AppModule_
Angular needs to know how the pieces of your application fit together
and what other files and libraries the app requires.
This information is called _metadata_
Some of the metadata is in the `@Component` decorators that you added to your component classes.
Other critical metadata is in [`@NgModule`](guide/ngmodules) decorators.
The most important `@NgModule` decorator annotates the top-level **AppModule** class.
The Angular CLI generated an `AppModule` class in `src/app/app.module.ts` when it created the project.
This is where you _opt-in_ to the `FormsModule`.
### Import _FormsModule_
Open `AppModule` (`app.module.ts`) and import the `FormsModule` symbol from the `@angular/forms` library.
Then add `FormsModule` to the `@NgModule` metadata's `imports` array, which contains a list of external modules that the app needs.
When the browser refreshes, the app should work again. You can edit the hero's name and see the changes reflected immediately in the `
` above the textbox.
### Declare _HeroesComponent_
Every component must be declared in _exactly one_ [NgModule](guide/ngmodules).
_You_ didn't declare the `HeroesComponent`.
So why did the application work?
It worked because the Angular CLI declared `HeroesComponent` in the `AppModule` when it generated that component.
Open `src/app/app.module.ts` and find `HeroesComponent` imported near the top.
The `HeroesComponent` is declared in the `@NgModule.declarations` array.
Note that `AppModule` declares both application components, `AppComponent` and `HeroesComponent`.
## Final code review
Your app should look like this . Here are the code files discussed on this page.
## Summary
* You used the CLI to create a second `HeroesComponent`.
* You displayed the `HeroesComponent` by adding it to the `AppComponent` shell.
* You applied the `UppercasePipe` to format the name.
* You used two-way data binding with the `ngModel` directive.
* You learned about the `AppModule`.
* You imported the `FormsModule` in the `AppModule` so that Angular would recognize and apply the `ngModel` directive.
* You learned the importance of declaring components in the `AppModule`
and appreciated that the CLI declared it for you.