75 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /* tslint:disable:forin */
 | |
| // #docregion
 | |
| import {
 | |
|   Component, Input, OnChanges,
 | |
|   SimpleChange, ViewChild
 | |
| } from '@angular/core';
 | |
| 
 | |
| class Hero {
 | |
|   constructor(public name: string) {}
 | |
| }
 | |
| 
 | |
| @Component({
 | |
|   selector: 'on-changes',
 | |
|   template: `
 | |
|   <div class="hero">
 | |
|     <p>{{hero.name}} can {{power}}</p>
 | |
| 
 | |
|     <h4>-- Change Log --</h4>
 | |
|     <div *ngFor="let chg of changeLog">{{chg}}</div>
 | |
|   </div>
 | |
|   `,
 | |
|   styles: [
 | |
|     '.hero {background: LightYellow; padding: 8px; margin-top: 8px}',
 | |
|     'p {background: Yellow; padding: 8px; margin-top: 8px}'
 | |
|   ]
 | |
| })
 | |
| export class OnChangesComponent implements OnChanges {
 | |
| // #docregion inputs
 | |
|   @Input() hero: Hero;
 | |
|   @Input() power: string;
 | |
| // #enddocregion inputs
 | |
| 
 | |
|   changeLog: string[] = [];
 | |
| 
 | |
|   // #docregion ng-on-changes
 | |
|   ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
 | |
|     for (let propName in changes) {
 | |
|       let chng = changes[propName];
 | |
|       let cur  = JSON.stringify(chng.currentValue);
 | |
|       let prev = JSON.stringify(chng.previousValue);
 | |
|       this.changeLog.push(`${propName}: currentValue = ${cur}, previousValue = ${prev}`);
 | |
|     }
 | |
|   }
 | |
|   // #enddocregion ng-on-changes
 | |
| 
 | |
|   reset() { this.changeLog.length = 0; }
 | |
| }
 | |
| 
 | |
| /***************************************/
 | |
| 
 | |
| @Component({
 | |
|   moduleId: module.id,
 | |
|   selector: 'on-changes-parent',
 | |
|   templateUrl: 'on-changes-parent.component.html',
 | |
|   styles: ['.parent {background: Lavender;}']
 | |
| })
 | |
| export class OnChangesParentComponent {
 | |
|   hero: Hero;
 | |
|   power: string;
 | |
|   title = 'OnChanges';
 | |
|   @ViewChild(OnChangesComponent) childView: OnChangesComponent;
 | |
| 
 | |
|   constructor() {
 | |
|     this.reset();
 | |
|   }
 | |
| 
 | |
|   reset() {
 | |
|     // new Hero object every time; triggers onChanges
 | |
|     this.hero = new Hero('Windstorm');
 | |
|     // setting power only triggers onChanges if this value is different
 | |
|     this.power = 'sing';
 | |
|     if (this.childView) { this.childView.reset(); }
 | |
|   }
 | |
| }
 |