ng-template
| |
| |
| |
| |
TemplateRef、ViewContainerRef
| |
| |
| |
NgTemplateOutlet
| |
| |
| |
复杂示例
| |
示例四
|
// 示例一
<!-- 通过ngIf结构型指令显示ng-template的内容 -->
<div class="lessons-list" *ngIf="condition else elseTemplate">
判断条件为真
</div>
<ng-template #elseTemplate>
<div>判断条件为假</div>
</ng-template>
// 示例二
import {AfterViewInit, Component, TemplateRef, ViewChild, ViewContainerRef} from '@angular/core';
@Component({
selector: 'app-template-section',
template: `
<ng-template #tpl>
Hello, ng-template!
</ng-template>
`,
styleUrls: ['./template-section.component.less']
})
export class TemplateSectionComponent implements AfterViewInit {
@ViewChild('tpl')
tplRef: TemplateRef<any>;
constructor(private vcRef: ViewContainerRef) {
}
ngAfterViewInit() {
// 这样tplRef对应的ng-template内容就显示出来了
this.vcRef.createEmbeddedView(this.tplRef);
}
}
export abstract class ViewContainerRef {
/*基于TemplateRef对象创建Embedded View(内嵌视图),然后根据`index`指定的值,插入到容器中。
如果没有指定`index`的值,新创建的视图将作为容器中的最后一个视图插入。*/
abstract createEmbeddedView<C>(
templateRef: TemplateRef<C>, //内嵌视图
context?: C, index?: number): // 创建上下文
EmbeddedViewRef<C>;
}
// 示例三
import {AfterViewInit, Component, TemplateRef, ViewChild, ViewContainerRef} from '@angular/core';
@Component({
selector: 'app-ng-template',
template: `
<!-- let-param 取的是绑定对象myContext的$implicit字段的值,let-param相和let-param="$implicit"是等价的, -->
<!-- let-name="name" 取的是绑定对象myContext里面name字段对应的值-->
<ng-template #inputTemplateWithContent let-param let-name="name">
<div>{{param}} - {{name}}</div>
</ng-template>
<ng-container *ngTemplateOutlet="inputTemplateWithContent; context: myContext"></ng-container>
`,
styleUrls: ['./ng-template.component.less']
})
export class NgTemplateComponent {
myContext = {$implicit: '默认值', name: 'tuacy'};
}
import {Component, Input, TemplateRef} from '@angular/core';
@Component({
selector: 'app-template-input',
template: `
<!-- 没有传递参数的时候就使用defaultTemplate里面的布局 -->
<ng-template #defaultTemplate>
<div>咱们没有传递参数</div>
</ng-template>
<ng-container *ngTemplateOutlet="inputTemplate ? inputTemplate: defaultTemplate"></ng-container>
`,
styleUrls: ['./template-input.component.less']
})
export class TemplateInputComponent {
@Input()
inputTemplate: TemplateRef<any>; // 模板作为参数
}
// 使用的时候的代码
<!-- 我们定义一个组件,把ng-template的内容作为参数传递进去 -->
<ng-template #paramTemplate>
<div>我是参数</div>
</ng-template>
<app-template-input [inputTemplate]="paramTemplate"></app-template-input>