1. 引言
我们在angular项目中经常会用到<ng-template>
,但是我们是否有想过放置在里边的代码最终都去哪儿了呢?
其实angular中的<ng-template>
和HMTL中的<template>
是类似的,都是作为预渲染的一个内容模版器,DOM解析器会处理里边的元素内容,以确保内容有效,但是元素的内容不会被渲染,在适当的时机,我们可以让它渲染到页面上。有关HTML的<template>
介绍可以查看这里。
2. ng-template
在@angular/core的核心库封装下,模版ng-template使用起来变得很简单。例如:
这里我们声明模版
1
<ng-template #greet>
2
<p>Thanks for your interest.</p>
3
</ng-template>
在xxx.component.ts中,我们可以使用@ViewChild装饰器获取模版实例
1
any>; (‘greet’) greetTemplate: TemplateRef<
怎么使用呢?我们可以创建一个占位符来将模版插入,即:ng-container
1
<ng-container #placeholder></ng-container>
在xxx.component.ts中,我们可以使用@ViewChild装饰器获取占位符实例并通过addTemplate()方法将模版插入
1
(‘placeholder’, {read: ViewContainerRef}) placeholderRef: ViewContainerRef;
2
3
addTemplate() {
4
this.placeholderRef.clear();
5
this.placeholderRef.createEmbeddedView(this.greetTemplate); // 创建嵌入式视图插入模版
6
}
我们还可以在模版中使用变量
- html中:
1 | <ng-template #details let-name let-place=”place”> |
2 | <div class=”container”> |
3 | <div class=”row”> |
4 | <div class=”col-md-3"> |
5 | <div class=”border p-3"> |
6 | <p> |
7 | <strong>{{name}}</strong> <small>{{place}}</small> |
8 | </p> |
9 | </div> |
10 | </div> |
11 | </div> |
12 | </div> |
13 | </ng-template> |
- ts中:
1 | any>; (‘details’) detailsTemplate: TemplateRef< |
2 | |
3 | this.placeholderRef.createEmbeddedView( |
4 | this.detailsTemplate, |
5 | { $implicit: ‘Pranesh’, place: ‘Erode’ } |
6 | ); |
$implicit 属性值将被分配给未初始化的参数:let-name,let-place 初始化为上下文对象中放置属性:place。
除了在ts中通过typescript创建嵌入视图插入模版以及模版变量。我们也可以在html中通过angular提供的ngTemplateOutlet模版指令嵌入。
1 | <ng-container [ngTemplateOutlet]=”details” [ngTemplateOutletContext]=”{$implicit: ‘Pranesh’, place: ‘Erode’}”></ng-container> |