定义

在Angular中,根据定义为:

Angular的元素定义了一个默认不被渲染的模板。

默认情况下使用模版是不会渲染的,但是在官方例子中有一个有意思的例子

  1. import { Component, ViewChild } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <input #ref1 type="text" [(ngModel)]="firstExample" />
  6. <!-- 会显示 -->
  7. <ng-template [ngIf]="true">
  8. <span>Value: {{ ref1.value }}</span>
  9. </ng-template>
  10. <br />
  11. <!-- 不会显示 -->
  12. <ng-template *ngIf="true">
  13. <span>Value: {{ ref1.value }}</span>
  14. </ng-template>
  15. `,
  16. styleUrls: ['./app.component.css'],
  17. })
  18. export class AppComponent {
  19. firstExample = '';
  20. }

image.png
在这个例子中,模版就会被渲染。

根据官方的描述

具有简写语法的简单形式

  1. <div *ngIf="condition">Content to render when condition is true.</div>

等价于

具有扩展语法的简单形式

  1. <ng-template [ngIf]="condition">
  2. <div>Content to render when condition is true.</div>
  3. </ng-template>

说明

通过,你可以定义模板内容,这些内容只有在你直接或间接地特别指示Angular进行渲染时才会被渲染,让你可以完全控制内容的显示方式和时间。

模版变量文档在这里,但是文档不是特别全,这里专门总结一下模版输入变量:

模版输入变量

官方文档是这样解释的,例子举的不是很明晰,我决定在文档中找一找相关例子。

模板输入变量是可以在模板的单个实例中引用的变量。你可以用 let 关键字声明模板输入变量,比如 let hero。

这里明确几个概念

<ng-template let-demo></ng-template>
其中let-demo是讲模版上下文中的变量绑定到当前模版中,demo我称之为输入变量绑定名,而且这中形式的声明是讲默认输入变量复制到了绑定名中了。
<ng-template let-i="index"></ng-template>,这种形式是,将模版上下文中的具体的变量index赋值给绑定变量名i中。

在ngIf中使用模版输入变量,例子

  1. @Component({
  2. selector: 'ng-if-as',
  3. template: `
  4. <button (click)="nextUser()">Next User</button>
  5. <br>
  6. <!--
  7. 使用ngIf简写模式,则会隐含一个ng-template包裹这个元素,使用as将结果保存到局部变量中
  8. 其实在这个隐藏模版中的上下文已经包含了user变量,此时是一个默认变量,这样就可以在里面
  9. 的模版中绑定这个变量let-user进行绑定默认变量
  10. -->
  11. <div *ngIf="userObservable | async as user; else loading">
  12. Hello {{user.last}}, {{user.first}}!
  13. </div>
  14. <ng-template #loading let-user>Waiting... (user is {{user|json}})</ng-template>
  15. `
  16. })
  17. export class NgIfAs {
  18. userObservable = new Subject<{first: string, last: string}>();
  19. first = ['John', 'Mike', 'Mary', 'Bob'];
  20. firstIndex = 0;
  21. last = ['Smith', 'Novotny', 'Angular'];
  22. lastIndex = 0;
  23. nextUser() {
  24. let first = this.first[this.firstIndex++];
  25. if (this.firstIndex >= this.first.length) this.firstIndex = 0;
  26. let last = this.last[this.lastIndex++];
  27. if (this.lastIndex >= this.last.length) this.lastIndex = 0;
  28. this.userObservable.next({first, last});
  29. }
  30. }

将输入变量绑定名变一下也可以。
具体看注释:

  1. import { Component, ViewChild } from '@angular/core';
  2. import { Subject } from 'rxjs';
  3. @Component({
  4. selector: 'app-root',
  5. template: `
  6. <button (click)="nextUser()">Next User</button>
  7. <br>
  8. <div *ngIf="userObservable | async as user; else loading">
  9. Hello {{user.last}}, {{user.first}}!
  10. </div>
  11. <!-- 输入变量绑定名改变了,也不会有影响 -->
  12. <ng-template #loading let-user1>Waiting... (user is {{user1|json}})</ng-template>
  13. `,
  14. styleUrls: ['./app.component.css'],
  15. })
  16. export class AppComponent {
  17. userObservable = new Subject<{ first: string; last: string }>();
  18. first = ['John', 'Mike', 'Mary', 'Bob'];
  19. firstIndex = 0;
  20. last = ['Smith', 'Novotny', 'Angular'];
  21. lastIndex = 0;
  22. nextUser() {
  23. let first = this.first[this.firstIndex++];
  24. if (this.firstIndex >= this.first.length) this.firstIndex = 0;
  25. let last = this.last[this.lastIndex++];
  26. if (this.lastIndex >= this.last.length) this.lastIndex = 0;
  27. this.userObservable.next({ first, last });
  28. }
  29. }

关于模版输入变量再来看这个例子:
具体看注释:

  1. @Component({
  2. selector: 'ng-template-outlet-example',
  3. template: `
  4. <ng-container *ngTemplateOutlet="greet"></ng-container>
  5. <hr>
  6. <!-- 手动挂载上下文context: myContext -->
  7. <ng-container *ngTemplateOutlet="eng; context: myContext"></ng-container>
  8. <hr>
  9. <!-- 手动挂载上下文context: myContext -->
  10. <ng-container *ngTemplateOutlet="svk; context: myContext"></ng-container>
  11. <hr>
  12. <ng-template #greet><span>Hello</span></ng-template>
  13. <!-- 将上下文绑定到当前模版中,let-name,形式是绑定上下文默认值 -->
  14. <ng-template #eng let-name><span>Hello {{name}}!</span></ng-template>
  15. <!-- 将上下文绑定到当前模版中,let-person="localSk",形式是绑定
  16. 上下文中的localSk变量绑定到person中 -->
  17. <ng-template #svk let-person="localSk"><span>Ahoj {{person}}!</span></ng-template>
  18. `
  19. })
  20. export class NgTemplateOutletExample {
  21. myContext = {
  22. $implicit: 'World'/* 上下文中,默认输入的值 */,
  23. localSk: 'Svet' /* 上下文中,具体输入的值 */
  24. };
  25. }

相关链接

模板变量
NgForOf局部变量
NgIf把条件结果保存在变量中
NgTemplateOutlet
ng-template