| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  | // #docregion
 | 
					
						
							|  |  |  | import { | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  |   Component, Input, | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |   OnChanges, SimpleChange, | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  | } from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 14:06:32 +02:00
										 |  |  | import { LoggerService }  from './logger.service'; | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'my-counter', | 
					
						
							|  |  |  |   template: `
 | 
					
						
							|  |  |  |   <div class="counter"> | 
					
						
							|  |  |  |     Counter = {{counter}} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <h5>-- Counter Change Log --</h5> | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  |     <div *ngFor="let chg of changeLog" mySpy>{{chg}}</div> | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |   </div> | 
					
						
							|  |  |  |   `,
 | 
					
						
							| 
									
										
										
										
											2016-08-09 17:38:25 +01:00
										 |  |  |   styles: ['.counter {background: LightYellow; padding: 8px; margin-top: 8px}'] | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-06-13 00:41:33 +02:00
										 |  |  | export class MyCounterComponent implements OnChanges { | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |   @Input() counter: number; | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  |   changeLog: string[] = []; | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Empty the changeLog whenever counter goes to zero
 | 
					
						
							|  |  |  |     // hint: this is a way to respond programmatically to external value changes.
 | 
					
						
							|  |  |  |     if (this.counter === 0) { | 
					
						
							|  |  |  |       this.changeLog.length = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // A change to `counter` is the only change we care about
 | 
					
						
							| 
									
										
										
										
											2016-05-06 06:17:34 -07:00
										 |  |  |     let chng = changes['counter']; | 
					
						
							|  |  |  |     let cur = chng.currentValue; | 
					
						
							|  |  |  |     let prev = JSON.stringify(chng.previousValue); // first time is {}; after is integer
 | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |     this.changeLog.push(`counter: currentValue = ${cur}, previousValue = ${prev}`); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /***************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'counter-parent', | 
					
						
							|  |  |  |   template: `
 | 
					
						
							|  |  |  |    <div class="parent"> | 
					
						
							|  |  |  |     <h2>Counter Spy</h2> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <button (click)="updateCounter()">Update counter</button> | 
					
						
							|  |  |  |     <button (click)="reset()">Reset Counter</button> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <my-counter [counter]="value"></my-counter> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <h4>-- Spy Lifecycle Hook Log --</h4> | 
					
						
							| 
									
										
										
										
											2016-04-29 01:36:35 +01:00
										 |  |  |     <div *ngFor="let msg of spyLog">{{msg}}</div> | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |    </div> | 
					
						
							|  |  |  |   `,
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:21:09 +00:00
										 |  |  |   styles: ['.parent {background: gold;}'], | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |   providers: [LoggerService] | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | export class CounterParentComponent { | 
					
						
							|  |  |  |   value: number; | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  |   spyLog: string[] = []; | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 14:06:32 +02:00
										 |  |  |   private logger: LoggerService; | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  |   constructor(logger: LoggerService) { | 
					
						
							| 
									
										
										
										
											2016-05-03 14:06:32 +02:00
										 |  |  |     this.logger = logger; | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |     this.spyLog = logger.logs; | 
					
						
							|  |  |  |     this.reset(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   updateCounter() { | 
					
						
							|  |  |  |     this.value += 1; | 
					
						
							| 
									
										
										
										
											2016-05-03 14:06:32 +02:00
										 |  |  |     this.logger.tick(); | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  |   reset() { | 
					
						
							| 
									
										
										
										
											2016-05-03 14:06:32 +02:00
										 |  |  |     this.logger.log('-- reset --'); | 
					
						
							| 
									
										
										
										
											2016-04-27 11:28:22 -07:00
										 |  |  |     this.value = 0; | 
					
						
							| 
									
										
										
										
											2016-05-03 14:06:32 +02:00
										 |  |  |     this.logger.tick(); | 
					
						
							| 
									
										
										
										
											2015-11-21 11:23:40 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |