| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  | // #docplaster
 | 
					
						
							|  |  |  | // #docregion
 | 
					
						
							|  |  |  | import { Component, OnInit } from '@angular/core'; | 
					
						
							|  |  |  | import { Router }            from '@angular/router'; | 
					
						
							|  |  |  | import { Observable }        from 'rxjs/Observable'; | 
					
						
							|  |  |  | import { Subject }           from 'rxjs/Subject'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { HeroSearchService } from './hero-search.service'; | 
					
						
							|  |  |  | import { Hero } from './hero'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'hero-search', | 
					
						
							|  |  |  |   templateUrl: 'app/hero-search.component.html', | 
					
						
							|  |  |  |   providers: [HeroSearchService] | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | export class HeroSearchComponent implements OnInit { | 
					
						
							|  |  |  |   // #docregion search
 | 
					
						
							| 
									
										
										
										
											2016-07-19 19:15:23 -04:00
										 |  |  |   heroes: Observable<Hero[]>; | 
					
						
							| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  |   // #enddocregion search
 | 
					
						
							| 
									
										
										
										
											2016-07-19 12:26:14 -07:00
										 |  |  |   // #docregion searchSubject
 | 
					
						
							|  |  |  |   searchSubject = new Subject<string>(); | 
					
						
							|  |  |  |   // #enddocregion searchSubject
 | 
					
						
							| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   constructor( | 
					
						
							|  |  |  |     private heroSearchService: HeroSearchService, | 
					
						
							|  |  |  |     private router: Router) {} | 
					
						
							| 
									
										
										
										
											2016-07-19 12:26:14 -07:00
										 |  |  |   // #docregion searchSubject
 | 
					
						
							| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-19 12:26:14 -07:00
										 |  |  |   // Push a search term into the observable stream.
 | 
					
						
							|  |  |  |   search(term: string) { this.searchSubject.next(term); } | 
					
						
							|  |  |  |   // #enddocregion searchSubject
 | 
					
						
							| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  |   // #docregion search
 | 
					
						
							| 
									
										
										
										
											2016-07-19 12:26:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  |   ngOnInit() { | 
					
						
							| 
									
										
										
										
											2016-07-19 12:26:14 -07:00
										 |  |  |     this.heroes = this.searchSubject | 
					
						
							|  |  |  |       .asObservable()           // cast as Observable
 | 
					
						
							| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  |       .debounceTime(300)        // wait for 300ms pause in events
 | 
					
						
							|  |  |  |       .distinctUntilChanged()   // ignore if next search term is same as previous
 | 
					
						
							|  |  |  |       .switchMap(term => term   // switch to new observable each time
 | 
					
						
							|  |  |  |         // return the http search observable
 | 
					
						
							|  |  |  |         ? this.heroSearchService.search(term) | 
					
						
							|  |  |  |         // or the observable of empty heroes if no search term
 | 
					
						
							|  |  |  |         : Observable.of<Hero[]>([])) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .catch(error => { | 
					
						
							|  |  |  |         // Todo: real error handling
 | 
					
						
							|  |  |  |         console.log(error); | 
					
						
							| 
									
										
										
										
											2016-07-19 19:15:23 -04:00
										 |  |  |         return Observable.of<Hero[]>([]); | 
					
						
							| 
									
										
										
										
											2016-05-23 22:24:15 -04:00
										 |  |  |       }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   // #enddocregion search
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gotoDetail(hero: Hero) { | 
					
						
							|  |  |  |     let link = ['/detail', hero.id]; | 
					
						
							|  |  |  |     this.router.navigate(link); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |