| 
									
										
										
										
											2016-01-20 19:14:46 -02:00
										 |  |  | // #docregion
 | 
					
						
							|  |  |  | import 'package:angular2/angular2.dart'; | 
					
						
							| 
									
										
										
										
											2016-01-27 15:51:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-20 19:14:46 -02:00
										 |  |  | import 'logger_service.dart'; | 
					
						
							| 
									
										
										
										
											2016-01-27 15:51:50 -08:00
										 |  |  | import 'spy_directive.dart'; | 
					
						
							| 
									
										
										
										
											2016-01-20 19:14:46 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | @Component( | 
					
						
							|  |  |  |     selector: 'my-counter', | 
					
						
							|  |  |  |     template: '''
 | 
					
						
							|  |  |  |     <div class="counter"> | 
					
						
							|  |  |  |       Counter = {{counter}} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <h5>-- Counter Change Log --</h5> | 
					
						
							|  |  |  |       <div *ngFor="#chg of changeLog" mySpy>{{chg}}</div> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |     ''',
 | 
					
						
							|  |  |  |     styles: const [ | 
					
						
							|  |  |  |       '.counter {background: LightYellow; padding: 8px; margin-top: 8px}' | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |     directives: const [Spy]) | 
					
						
							|  |  |  | class MyCounter implements OnChanges { | 
					
						
							|  |  |  |   @Input() num counter; | 
					
						
							|  |  |  |   List<String> changeLog = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ngOnChanges(Map<String, SimpleChange> changes) { | 
					
						
							|  |  |  |     // Empty the changeLog whenever counter goes to zero
 | 
					
						
							|  |  |  |     // hint: this is a way to respond programmatically to external value changes.
 | 
					
						
							|  |  |  |     if (this.counter == 0) { | 
					
						
							|  |  |  |       changeLog.clear(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // A change to `counter` is the only change we care about
 | 
					
						
							|  |  |  |     SimpleChange prop = changes['counter']; | 
					
						
							|  |  |  |     var prev = prop.isFirstChange() ? "{}" : prop.previousValue; | 
					
						
							|  |  |  |     changeLog.add( | 
					
						
							|  |  |  |         'counter: currentValue = ${prop.currentValue}, 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> | 
					
						
							|  |  |  |       <div *ngFor="#msg of spyLog">{{msg}}</div> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |     ''',
 | 
					
						
							|  |  |  |     styles: const [ | 
					
						
							|  |  |  |       '.parent {background: gold; padding: 10px; margin:100px 8px;}' | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |     directives: const [MyCounter], | 
					
						
							|  |  |  |     providers: const [LoggerService]) | 
					
						
							|  |  |  | class CounterParentComponent { | 
					
						
							|  |  |  |   num value; | 
					
						
							|  |  |  |   List<String> spyLog = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   LoggerService _logger; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CounterParentComponent(this._logger) { | 
					
						
							|  |  |  |     spyLog = _logger.logs; | 
					
						
							|  |  |  |     reset(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   updateCounter() => value += 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   reset() { | 
					
						
							|  |  |  |     _logger.log('-- reset --'); | 
					
						
							|  |  |  |     value = 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |