84 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import { | ||
|  |   Component, | ||
|  |   ContentChild, | ||
|  |   Input, | ||
|  |   QueryList, | ||
|  |   ViewChildren | ||
|  | } from '@angular/core'; | ||
|  | 
 | ||
|  | @Component({ | ||
|  |   selector: 'content-child', | ||
|  |   template: `
 | ||
|  |   <span class="content-child" *ngIf="active"> | ||
|  |     Active | ||
|  |   </span>`
 | ||
|  | }) | ||
|  | export class ContentChildComponent { | ||
|  |   active = false; | ||
|  | 
 | ||
|  |   activate() { | ||
|  |     this.active = !this.active; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | ////////////////////
 | ||
|  | 
 | ||
|  | // #docregion content
 | ||
|  | @Component({ | ||
|  |   selector: 'view-child', | ||
|  |   template: `
 | ||
|  |   <h2 [class.active]=active> | ||
|  |     {{hero.name}} | ||
|  |     <ng-content></ng-content> | ||
|  |   </h2>`,
 | ||
|  |   styles: ['.active {font-weight: bold; background-color: skyblue;}'] | ||
|  | }) | ||
|  | export class ViewChildComponent { | ||
|  |   @Input() hero: any; | ||
|  |   active = false; | ||
|  | 
 | ||
|  |   @ContentChild(ContentChildComponent) content: ContentChildComponent; | ||
|  | 
 | ||
|  |   activate() { | ||
|  |     this.active = !this.active; | ||
|  |     this.content.activate(); | ||
|  |   } | ||
|  | } | ||
|  | // #enddocregion content
 | ||
|  | 
 | ||
|  | ////////////////////
 | ||
|  | 
 | ||
|  | // #docregion view
 | ||
|  | @Component({ | ||
|  |   selector: 'hero-queries', | ||
|  |   template: `
 | ||
|  |     <view-child *ngFor="let hero of heroData" [hero]="hero"> | ||
|  |       <content-child></content-child> | ||
|  |     </view-child> | ||
|  |     <button (click)="activate()">{{buttonLabel}} All</button> | ||
|  |   `
 | ||
|  | }) | ||
|  | export class HeroQueriesComponent { | ||
|  |   active = false; | ||
|  |   heroData = [ | ||
|  |     {id: 1, name: 'Windstorm'}, | ||
|  |     {id: 2, name: 'LaughingGas'} | ||
|  |   ]; | ||
|  | 
 | ||
|  |   @ViewChildren(ViewChildComponent) views: QueryList<ViewChildComponent>; | ||
|  | 
 | ||
|  |   activate() { | ||
|  |     this.active = !this.active; | ||
|  |     this.views.forEach( | ||
|  |       view => view.activate() | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   // #docregion defined-property
 | ||
|  |   get buttonLabel() { | ||
|  |     return this.active ? 'Deactivate' : 'Activate'; | ||
|  |   } | ||
|  |   // #enddocregion defined-property
 | ||
|  | } | ||
|  | // #enddocregion view
 |