Single content projectionUsing ng-content to implement <!-- Component- app-content-single --> <div> <h2>Title</h2> <!-- Projection content display position--> <ng-content></ng-content> </div> <!-- Usage --> <app-content-single> <div>this is content</div> </app-content-single> Multi-content projection Using <!-- Component- app-content-more --> <div> <h3>Herder Title</h3> <ng-content select=".header"></ng-content> <h3>Body Title</h3> <ng-content select="[body]"></ng-content> <h3>Default Title</h3> <ng-content></ng-content> <h3>Footer Title</h3> <ng-content select="footer"></ng-content> </div> <!-- Usage --> <app-content-more> <div>this is default01</div> <div class="header">this is header</div> <div>this is default02</div> <div body>this is body</div> <div>this is default03</div> <footer>this is footer</footer> <div>this is default04</div> </app-content-more> Conditional content projection - Content projection for a single conditionFor example: suppose there is a list of people now. When the money of a person is greater than 200, the content defined in the template in the component is added Define an appChildRef directive to cooperate with ng-template to obtain the template import { Directive, TemplateRef } from '@angular/core'; @Directive({ selector: '[appChildRef]' }) export class ChildRefDirective { constructor(public templateRef: TemplateRef<any>) { } } app-persons-html<div class="list-item" *ngFor="let person of persons;"> <div>Name: {{ person.name }}</div> <div>Money: {{ person.money }}</div> <div *ngIf="person.money > 200"> <ng-container *ngIf="childRef" [ngTemplateOutlet]="childRef.templateRef"></ng-container> </div> </div> app-persons - tsimport { Component, ContentChild, OnInit } from '@angular/core'; import { ChildRefDirective } from '../../../../directives/child-ref.directive'; @Component({ selector: 'app-persons', templateUrl: './persons.component.html', styleUrls: ['./persons.component.scss'] }) export class PersonsComponent implements OnInit { persons: { name: string; money: number; }[] = [ { name: 'Jack', money: 120 }, { name: 'Li Li', money: 210 }, { name: 'Zhang San', money: 170 }, ]; @ContentChild(ChildRefDirective, { static: true }) childRef!: ChildRefDirective; constructor() { } ngOnInit(): void { } } use<app-persons> <ng-template appChildRef> <div style="font-size: 14px; color: red;">this is child ref content</div> </ng-template> </app-persons> RenderingMultiple conditional content projectionEg: Now we want to bind the embedded template to display through the fields in the persons data appChildRef Adjustmentimport { Directive, Input, TemplateRef } from '@angular/core'; @Directive({ selector: '[appChildRef]' }) export class ChildRefDirective { // Accept the defined template name - display the corresponding template content through this name and the render field in persons @Input() appChildRef!: string; constructor(public templateRef: TemplateRef<any>) { } } app-persons-html<div class="list-item" *ngFor="let person of persons;let i=index;"> <div>Name: {{ person.name }}</div> <div>Money: {{ person.money }}</div> <!-- <div *ngIf="person.money > 200"> <ng-container *ngIf="childRef" [ngTemplateOutlet]="childRef.templateRef"></ng-container> </div> --> <div *ngIf="person.render && tempRefs[person.render]"> <!-- Use the ngTemplateOutlet directive to pass the current person data to the template --> <ng-container *ngTemplateOutlet="tempRefs[person.render].templateRef; context: { $implicit: person, i: i }"></ng-container> </div> </div> app-persons - tsimport { Component, ContentChild, ContentChildren, OnInit, QueryList } from '@angular/core'; import { ChildRefDirective } from '../../../../directives/child-ref.directive'; @Component({ selector: 'app-form-unit', templateUrl: './form-unit.component.html', styleUrls: ['./form-unit.component.scss'] }) export class FormUnitComponent implements OnInit { persons: { name: string; money: number; render?: string; }[] = [ { name: 'Jack', money: 120, render: 'temp1' }, { name: '李莉', money: 210, render: 'temp2' }, { name: '张三', money: 170, render: 'temp3' }, ]; // @ContentChild(ChildRefDirective, { static: true }) childRef!: ChildRefDirective; @ContentChildren(ChildRefDirective) childrenRef!: QueryList<ChildRefDirective>; get tempRefs() { const aObj: any = {}; this.childrenRef.forEach(template => { const key: string = template.appChildRef; aObj[key] = template; }) return aObj; } constructor() { } ngOnInit(): void { } } use<app-persons> <ng-template appChildRef="temp1" let-person let-index="i"> <div style="font-size: 14px; color: red;">{{index}}-{{person.name}}: this is temp1</div> </ng-template> <ng-template appChildRef="temp2" let-person let-index="i"> <div style="font-size: 14px; color: green;">{{index}}-{{person.name}}: this is temp2</div> </ng-template> <ng-template appChildRef="temp3" let-person let-index="i"> <div style="font-size: 14px; color: orange;">{{index}}-{{person.name}}: this is temp3</div> </ng-template> </app-persons> Rendering SummarizeThis article ends here. I hope it can be helpful to you. I also hope you can pay more attention to more content on 123WORDPRESS.COM! You may also be interested in:
|
<<: How to reduce the root directory of XFS partition format in Linux
>>: SQL Aggregation, Grouping, and Sorting
From development to deployment, do it yourself Wh...
1. Embedded Software Level 1) Bootloader->Boot...
Table of contents 1. Basic Concepts of GTID 2. GT...
What is MIME TYPE? 1. First, we need to understan...
The test environment of this experiment: Windows ...
Just like code, you can add comments to tables an...
1. Pull the redis image docker pull redis 2. Star...
Table of contents background Purpose Before split...
Less is More is a catchphrase for many designers....
Both methods can be used to execute a piece of ja...
Everything is a file! UNIX has already said it. E...
Table of contents 1. Offline installation 2. Onli...
Sometimes it is necessary to perform simple verif...
This article introduces the sample code for imple...
When I was helping someone adjust the code today,...