Mainly copyedits, but also - Dart .jade extends TS .jade file with minor overrides - Significant update of example code (so it matches the ts example in its appearance and behavior). - Tweaks to Dart code. - A few extra/corrected mixin definitions in `_util-fns.jade`.
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/* tslint:disable:forin */
 | 
						|
// #docregion
 | 
						|
import { Component, DoCheck, Input, OnChanges, SimpleChange, ViewChild } from '@angular/core';
 | 
						|
 | 
						|
class Hero {
 | 
						|
  constructor(public name: string) {}
 | 
						|
}
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'do-check',
 | 
						|
  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 DoCheckComponent implements DoCheck, OnChanges {
 | 
						|
  @Input() hero: Hero;
 | 
						|
  @Input() power: string;
 | 
						|
 | 
						|
  changeDetected = false;
 | 
						|
  changeLog: string[] = [];
 | 
						|
  oldHeroName = '';
 | 
						|
  oldPower = '';
 | 
						|
  oldLogLength = 0;
 | 
						|
  noChangeCount = 0;
 | 
						|
 | 
						|
  // #docregion ng-do-check
 | 
						|
  ngDoCheck() {
 | 
						|
 | 
						|
    if (this.hero.name !== this.oldHeroName) {
 | 
						|
      this.changeDetected = true;
 | 
						|
      this.changeLog.push(`DoCheck: Hero name changed to "${this.hero.name}" from "${this.oldHeroName}"`);
 | 
						|
      this.oldHeroName = this.hero.name;
 | 
						|
    }
 | 
						|
 | 
						|
    if (this.power !== this.oldPower) {
 | 
						|
      this.changeDetected = true;
 | 
						|
      this.changeLog.push(`DoCheck: Power changed to "${this.power}" from "${this.oldPower}"`);
 | 
						|
      this.oldPower = this.power;
 | 
						|
    }
 | 
						|
 | 
						|
    if (this.changeDetected) {
 | 
						|
        this.noChangeCount = 0;
 | 
						|
    } else {
 | 
						|
        // log that hook was called when there was no relevant change.
 | 
						|
        let count = this.noChangeCount += 1;
 | 
						|
        let noChangeMsg = `DoCheck called ${count}x when no change to hero or power`;
 | 
						|
        if (count === 1) {
 | 
						|
          // add new "no change" message
 | 
						|
          this.changeLog.push(noChangeMsg);
 | 
						|
        } else {
 | 
						|
          // update last "no change" message
 | 
						|
          this.changeLog[this.changeLog.length - 1] = noChangeMsg;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    this.changeDetected = false;
 | 
						|
  }
 | 
						|
  // #enddocregion ng-do-check
 | 
						|
 | 
						|
  // Copied from OnChangesComponent
 | 
						|
  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(`OnChanges: ${propName}: currentValue = ${cur}, previousValue = ${prev}`);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  reset() {
 | 
						|
    this.changeDetected = true;
 | 
						|
    this.changeLog.length = 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/***************************************/
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'do-check-parent',
 | 
						|
  templateUrl: 'app/on-changes-parent.component.html',
 | 
						|
  styles: ['.parent {background: Lavender}'],
 | 
						|
  directives: [DoCheckComponent]
 | 
						|
})
 | 
						|
export class DoCheckParentComponent {
 | 
						|
  hero: Hero;
 | 
						|
  power: string;
 | 
						|
  title = 'DoCheck';
 | 
						|
  @ViewChild(DoCheckComponent) childView: DoCheckComponent;
 | 
						|
 | 
						|
  constructor() { this.reset(); }
 | 
						|
 | 
						|
  reset() {
 | 
						|
    this.hero = new Hero('Windstorm');
 | 
						|
    this.power = 'sing';
 | 
						|
    if (this.childView) { this.childView.reset(); }
 | 
						|
  }
 | 
						|
}
 |