103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
// #docregion
 | 
						|
import {
 | 
						|
  Component, Input, Output,
 | 
						|
  AfterContentChecked, AfterContentInit, ContentChild,
 | 
						|
  AfterViewInit, ViewChild
 | 
						|
} from 'angular2/core';
 | 
						|
 | 
						|
import {ChildComponent} from './child.component';
 | 
						|
import {LoggerService}  from './logger.service';
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'after-content',
 | 
						|
  template: `
 | 
						|
  <div class="after-content">
 | 
						|
    <div>-- child content begins --</div>
 | 
						|
 | 
						|
    <ng-content></ng-content>
 | 
						|
 | 
						|
    <div>-- child content ends --</div>
 | 
						|
  </div>
 | 
						|
  `,
 | 
						|
  styles: ['.after-content {background: LightCyan; padding: 8px;}'],
 | 
						|
 | 
						|
})
 | 
						|
export class AfterContentComponent
 | 
						|
  implements AfterContentChecked, AfterContentInit, AfterViewInit {
 | 
						|
 | 
						|
  private _logger:LoggerService;
 | 
						|
 | 
						|
  constructor(logger:LoggerService){
 | 
						|
    this._logger = logger;
 | 
						|
    logger.log('AfterContent ctor: ' + this._getMessage());
 | 
						|
  }
 | 
						|
 | 
						|
  // Query for a CONTENT child of type `ChildComponent`
 | 
						|
  @ContentChild(ChildComponent) contentChild: ChildComponent;
 | 
						|
 | 
						|
  // Query for a VIEW child of type`ChildComponent`
 | 
						|
  // No such VIEW child exists!
 | 
						|
  // This component holds content but no view of that type.
 | 
						|
  @ViewChild(ChildComponent) viewChild: ChildComponent;
 | 
						|
 | 
						|
 | 
						|
  ///// Hooks
 | 
						|
  ngAfterContentInit() {
 | 
						|
    // contentChild is set after the content has been initialized
 | 
						|
    this._logger.log('AfterContentInit: ' + this._getMessage());
 | 
						|
  }
 | 
						|
 | 
						|
  ngAfterViewInit() {
 | 
						|
    this._logger.log(`AfterViewInit: There is ${this.viewChild ? 'a' : 'no'} view child`);
 | 
						|
  }
 | 
						|
 | 
						|
  private _prevHero:string;
 | 
						|
  ngAfterContentChecked() {
 | 
						|
    // contentChild is updated after the content has been checked
 | 
						|
    // Called frequently; only report when the hero changes
 | 
						|
    if (!this.contentChild || this._prevHero === this.contentChild.hero) {return;}
 | 
						|
    this._prevHero = this.contentChild.hero;
 | 
						|
    this._logger.log('AfterContentChecked: ' + this._getMessage());
 | 
						|
  }
 | 
						|
 | 
						|
  private _getMessage(): string {
 | 
						|
    let cmp = this.contentChild;
 | 
						|
    return cmp ? `"${cmp.hero}" child content` : 'no child content';
 | 
						|
  }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
/***************************************/
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'after-content-parent',
 | 
						|
  template: `
 | 
						|
  <div class="parent">
 | 
						|
    <h2>AfterContent</h2>
 | 
						|
 | 
						|
    <after-content>
 | 
						|
      <input [(ngModel)]="hero">
 | 
						|
      <button (click)="showChild = !showChild">Toggle child view</button>
 | 
						|
 | 
						|
      <my-child *ngIf="showChild" [hero]="hero"></my-child>
 | 
						|
    </after-content>
 | 
						|
 | 
						|
    <h4>-- Lifecycle Hook Log --</h4>
 | 
						|
    <div *ngFor="#msg of hookLog">{{msg}}</div>
 | 
						|
  </div>
 | 
						|
  `,
 | 
						|
  styles: ['.parent {background: powderblue; padding: 8px; margin:100px 8px;}'],
 | 
						|
  directives: [AfterContentComponent, ChildComponent],
 | 
						|
  providers:[LoggerService]
 | 
						|
})
 | 
						|
export class AfterContentParentComponent {
 | 
						|
 | 
						|
  hookLog:string[];
 | 
						|
  hero = 'Magneta';
 | 
						|
  showChild = true;
 | 
						|
 | 
						|
  constructor(logger:LoggerService){
 | 
						|
    this.hookLog = logger.logs;
 | 
						|
  }
 | 
						|
}
 |