2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# Services
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The Tour of Heroes `HeroesComponent`  is currently getting and displaying fake data.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								After the refactoring in this tutorial, `HeroesComponent`  will be lean and focused on supporting the view.
							 
						 
					
						
							
								
									
										
										
										
											2017-11-30 01:13:54 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								It will also be easier to unit-test with a mock service.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Why services
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Components shouldn't fetch or save data directly and they certainly shouldn't knowingly present fake data.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								They should focus on presenting data and delegate data access to a service.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In this tutorial, you'll create a `HeroService`  that all application classes can use to get heroes.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Instead of creating that service with `new` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								you'll rely on Angular [*dependency injection* ](guide/dependency-injection ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								to inject it into the `HeroesComponent`  constructor.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Services are a great way to share information among classes that _don't know each other_ .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								You'll create a `MessageService`  and inject it in two places:
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								1.  in `HeroService`  which uses the service to send a message. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  in `MessagesComponent`  which displays that message. 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Create the _HeroService_
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Using the Angular CLI, create a service called `hero` .
							 
						 
					
						
							
								
									
										
										
										
											2017-03-30 20:04:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< code-example  language = "sh"  class = "code-shell" >  
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  ng generate service hero
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 10:17:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The command generates skeleton `HeroService`  class in `src/app/hero.service.ts` 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `HeroService`  class should look like the below.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/hero.service.1.ts"  region = "new"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 title="src/app/hero.service.ts (new service)" linenums="false">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### _@Injectable()_ services
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Notice that the new service imports the Angular `Injectable`  symbol and annotates
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								the class with the `@Injectable()`  decorator.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `@Injectable()`  decorator tells Angular that this service _might_  itself
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								have injected dependencies.
							 
						 
					
						
							
								
									
										
										
										
											2017-11-08 16:22:30 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								It doesn't have dependencies now but [it will soon ](#inject-message-service ).
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Whether it does or it doesn't, it's good practice to keep the decorator.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< div  class = "l-sub-section" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The Angular [style guidelines ](guide/styleguide#style-07-04 ) strongly recommend keeping it
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								and the linter enforces this rule.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Get hero data
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `HeroService`  could get hero data from anywhere— a web service, local storage, or a mock data source. 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Removing data access from components means you can change your mind about the implementation anytime, without touching any components.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								They don't know how the service works.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The implementation in _this_  tutorial will continue to deliver _mock heroes_ .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Import the `Hero`  and `HEROES` .
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/hero.service.ts"  region = "import-heroes" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Add a `getHeroes`  method to return the _mock heroes_ .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/hero.service.1.ts"  region = "getHeroes" >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  provide}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Provide the `HeroService`
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								You must _provide_  the `HeroService`  in the _dependency injection system_ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								before Angular can _inject_  it into the `HeroesComponent` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								as you will do [below ](#inject ).
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-11 07:05:00 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								There are several ways to provide the `HeroService` : 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								in the `HeroesComponent` , in the `AppComponent` , in the `AppModule` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Each option has pros and cons. 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This tutorial chooses to provide it in the `AppModule` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								That's such a popular choice that you could have told the CLI to provide it there automatically
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								by appending `--module=app` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  language = "sh"  class = "code-shell" >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ng generate service hero --module=app
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Since you did not, you'll have to provide it yourself.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Open the `AppModule`  class, import the `HeroService` , and add it to the `@NgModule.providers`  array.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 21:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/app.module.ts"  linenums = "false"  title = "src/app/app.module.ts (providers)"  region = "providers-heroservice" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `providers`  array tells Angular to create a single, shared instance of `HeroService` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								and inject into any class that asks for it.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `HeroService`  is now ready to plug into the `HeroesComponent` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 21:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< div  class = "alert is-important" >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								This is a interim code sample that will allow you to provide and use the `HeroService` .  At this point, the code will differ from the `HeroService`  in the ["final code review" ](#final-code-review ).
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< div  class = "alert is-helpful" >  
						 
					
						
							
								
									
										
										
										
											2017-11-10 11:23:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-04 10:58:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  Learn more about _providers_  in the [Providers ](guide/providers ) guide.
							 
						 
					
						
							
								
									
										
										
										
											2017-11-10 11:23:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Update `HeroesComponent`
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Open the `HeroesComponent`  class file.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Delete the `HEROES`  import as you won't need that anymore.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Import the `HeroService`  instead.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/heroes/heroes.component.ts"  title = "src/app/heroes/heroes.component.ts (import HeroService)"  region = "hero-service-import" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-29 22:36:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Replace the definition of the `heroes`  property with a simple declaration.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/heroes/heroes.component.ts"  region = "heroes" >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  inject}
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Inject the `HeroService`
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Add a private `heroService`  parameter of type `HeroService`  to the constructor.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/heroes/heroes.component.ts"  region = "ctor" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The parameter simultaneously defines a private `heroService`  property and identifies it as a `HeroService`  injection site.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								When Angular creates a `HeroesComponent` , the [Dependency Injection ](guide/dependency-injection ) system
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sets the `heroService`  parameter to the singleton instance of `HeroService` . 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Add _getHeroes()_
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Create a function to retrieve the heroes from the service.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/heroes/heroes.component.1.ts"  region = "getHeroes" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  oninit}
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Call it in `ngOnInit`
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								While you could call `getHeroes()`  in the constructor, that's not the best practice.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Reserve the constructor for simple initialization such as wiring constructor parameters to properties.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The constructor shouldn't _do anything_ .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								It certainly shouldn't call a function that makes HTTP requests to a remote server as a _real_  data service would.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Instead, call `getHeroes()`  inside the [*ngOnInit lifecycle hook* ](guide/lifecycle-hooks ) and
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								let Angular call `ngOnInit`  at an appropriate time _after_  constructing a `HeroesComponent`  instance.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/heroes/heroes.component.ts"  region = "ng-on-init" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### See it run
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								After the browser refreshes, the app should run as before, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								showing a list of heroes and a hero detail view when you click on a hero name.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Observable data
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `HeroService.getHeroes()`  method has a _synchronous signature_ ,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								which implies that the `HeroService`  can fetch heroes synchronously.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The `HeroesComponent`  consumes the `getHeroes()`  result 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								as if heroes could be fetched synchronously.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/heroes/heroes.component.1.ts"  region = "get-heroes" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This will not work in a real app.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								You're getting away with it now because the service currently returns _mock heroes_ .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								But soon the app will fetch heroes from a remote server, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								which is an inherently _asynchronous_  operation.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `HeroService`  must wait for the server to respond,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`getHeroes()`  cannot return immediately with hero data, 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								and the browser will not block while the service waits.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								`HeroService.getHeroes()`  must have an _asynchronous signature_  of some kind. 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								It can take a callback. It could return a `Promise` . It could return an `Observable` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In this tutorial, `HeroService.getHeroes()`  will return an `Observable` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								in part because it will eventually use the Angular `HttpClient.get`  method to fetch the heroes
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								and [`HttpClient.get()` returns an `Observable` ](guide/http ).
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Observable _HeroService_
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								`Observable`  is one of the key classes in the [RxJS library ](http://reactivex.io/rxjs/ ). 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In a [later tutorial on HTTP ](tutorial/toh-pt6 ), you'll learn that Angular's `HttpClient`  methods return RxJS `Observable` s.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								In this tutorial, you'll simulate getting data from the server with the RxJS `of()`  function.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Open the `HeroService`  file and import the `Observable`  and `of`  symbols from RxJS.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/hero.service.ts"   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								title="src/app/hero.service.ts (Observable imports)" region="import-observable">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Replace the `getHeroes`  method with this one.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/hero.service.ts"  region = "getHeroes-1" > < / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								`of(HEROES)`  returns an `Observable<Hero[]>`  that emits  _a single value_ , the array of mock heroes. 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< div  class = "l-sub-section" >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In the [HTTP tutorial ](tutorial/toh-pt6 ), you'll call `HttpClient.get<Hero[]>()`  which also returns an `Observable<Hero[]>`  that emits  _a single value_ , an array of heroes from the body of the HTTP response.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Subscribe in _HeroesComponent_
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `HeroService.getHeroes`  method used to return a `Hero[]` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Now it returns an `Observable<Hero[]>` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								You'll have to adjust to that difference in `HeroesComponent` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Find the `getHeroes`  method and replace it with the following code
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								(shown side-by-side with the previous version for comparison)
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-tabs >  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-04 10:58:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "heroes.component.ts (Observable)"  
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    path="toh-pt4/src/app/heroes/heroes.component.ts" region="getHeroes">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-04 10:58:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "heroes.component.ts (Original)"  
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    path="toh-pt4/src/app/heroes/heroes.component.1.ts" region="getHeroes">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-tabs >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								`Observable.subscribe()`  is the critical difference. 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The previous version assigns an array of heroes to the component's `heroes`  property.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The assignment occurs _synchronously_ , as if the server could return heroes instantly
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								or the browser could freeze the UI while it waited for the server's response.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								That _won't work_  when the `HeroService`  is actually making requests of a remote server.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The new version waits for the `Observable`  to emit the array of heroes—  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								which could happen now or several minutes from now.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Then `subscribe`  passes the emitted array to the callback,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								which sets the component's `heroes`  property.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This asynchronous approach _will work_  when
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								the `HeroService`  requests heroes from the server.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Show messages
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In this section you will 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  add a `MessagesComponent`  that displays app messages at the bottom of the screen. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  create an injectable, app-wide `MessageService`  for sending messages to be displayed 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  inject `MessageService`  into the `HeroService`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  display a message when `HeroService`  fetches heroes successfully. 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Create _MessagesComponent_
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Use the CLI to create the `MessagesComponent` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  language = "sh"  class = "code-shell" >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ng generate component messages
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The CLI creates the component files in the `src/app/messages`  folder and declare `MessagesComponent`  in `AppModule` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Modify the `AppComponent`  template to display the generated `MessagesComponent` 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  title = "/src/app/app.component.html"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/app.component.html">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								You should see the default paragraph from `MessagesComponent`  at the bottom of the page.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Create the _MessageService_
  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Use the CLI to create the `MessageService`  in `src/app` . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The `--module=app`  option tells the CLI to  [_provide_ this service ](#provide ) in the `AppModule` ,
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  language = "sh"  class = "code-shell" >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ng generate service message --module=app
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Open `MessageService`  and replace its contents with the following.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  title = "/src/app/message.service.ts"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/message.service.ts">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The service exposes its cache of `messages`  and two methods: one to `add()`  a message to the cache and another to `clear()`  the cache.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  inject-message-service}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								### Inject it into the `HeroService`
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Re-open the `HeroService`  and import the `MessageService` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  title = "/src/app/hero.service.ts (import MessageService)"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/hero.service.ts" region="import-message-service">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Modify the constructor with a parameter that declares a private `messageService`  property.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Angular will inject the singleton `MessageService`  into that property 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								when it creates the `HeroService` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/hero.service.ts" region="ctor">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< div  class = "l-sub-section" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This is a typical "*service-in-service*" scenario:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								you inject the `MessageService`  into the `HeroService`  which is injected into the `HeroesComponent` .
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Send a message from `HeroService`
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Modify the `getHeroes`  method to send a message when the heroes are fetched.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "toh-pt4/src/app/hero.service.ts"  region = "getHeroes" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Display the message from `HeroService`
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `MessagesComponent`  should display all messages, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								including the message sent by the `HeroService`  when it fetches heroes.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Open `MessagesComponent`  and import the `MessageService` .
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  title = "/src/app/messages/messages.component.ts (import MessageService)"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/messages/messages.component.ts" region="import-message-service">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Modify the constructor with a parameter that declares a **public**  `messageService`  property.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Angular will inject the singleton `MessageService`  into that property 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								when it creates the `HeroService` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/messages/messages.component.ts" region="ctor">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `messageService`  property **must be public**  because you're about to bind to it in the template.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< div  class = "alert is-important" >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Angular only binds to _public_  component properties.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								### Bind to the _MessageService_
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Replace the CLI-generated `MessagesComponent`  template with the following.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  title = "src/app/messages/messages.component.html"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/messages/messages.component.html">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This template binds directly to the component's `messageService` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  The `*ngIf`  only displays the messages area if there are messages to show. 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  An `*ngFor`  presents the list of messages in repeated `<div>`  elements. 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  An Angular [event binding ](guide/template-syntax#event-binding ) binds the button's click event 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								to `MessageService.clear()` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The messages will look better when you add the private CSS styles to `messages.component.css` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								as listed in one of the ["final code review" ](#final-code-review ) tabs below.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The browser refreshes and the page displays the list of heroes.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Scroll to the bottom to see the message from the `HeroService`  in the message area.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Click the "clear" button and the message area disappears.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  final-code-review}
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Final code review
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Here are the code files discussed on this page and your app should look like this < live-example > < / live-example > .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-tabs >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/hero.service.ts"  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/hero.service.ts">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/message.service.ts"  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/message.service.ts">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/heroes/heroes.component.ts" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/heroes/heroes.component.ts">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/messages/messages.component.ts" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/messages/messages.component.ts">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/messages/messages.component.html" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/messages/messages.component.html">
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/messages/messages.component.css" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/messages/messages.component.css">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 21:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/app.module.ts" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/app.module.ts">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  title = "src/app/app.component.html" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path="toh-pt4/src/app/app.component.html">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-tabs >  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-27 16:45:47 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Summary
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-06 19:02:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  You refactored data access to the `HeroService`  class. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  You _provided_  the `HeroService`  in the root `AppModule`  so that it can be injected anywhere. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  You used [Angular Dependency Injection ](guide/dependency-injection ) to inject it into a component. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  You gave the `HeroService`  _get data_  method an asynchronous signature. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  You discovered `Observable`  and the RxJS _Observable_  library. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  You used RxJS `of()`  to return an _Observable_  of mock heroes (`Observable<Hero[]>` ). 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  The component's `ngOnInit`  lifecycle hook calls the `HeroService`  method, not the constructor. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  You created a `MessageService`  for loosely-coupled communication between classes. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  The `HeroService`  injected into a component is created with another injected service, 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 `MessageService` .