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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |