ng-template

本文介绍了Angular中的ng-template元素,解释了其如何与结构型指令配合使用来渲染HTML内容。通过示例展示了*ngIf语法糖背后的ng-template实现,并提供了自定义指令与ViewContainerRef操作的具体用法。
摘要由CSDN通过智能技术生成

ng-template

<ng-template>是一个Angular元素,用来渲染HTML,它不会直接展示在页面上,需要通过结构型指令将内容渲染到页面中。

在我们日常开发中见到的结构型指令,如 *ngIf,ngFor 是一个微语法,解开之后会变成 <ng-template>标签。在介绍<ng-template>之前我们下看一下ngIf解开语法糖,会是怎样的一个结构

*ngIf

<div *ngIf="hero" class="name">{{hero.name}}</div>

<!-- *ngIf翻译成ng-template元素之后 -->
<ng-template [ngIf]="hero">
  <div class="name">{{hero.name}}</div>
</ng-template>

  • *ngIf变成属性型指令,并绑定在ng-template元素上
  • *ngIf的宿主元素被包含在ng-template元素内

ng-template用法

用法1

利用指令插入模板

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

@Directive({ selector: '[appUnless]' })
export class UnlessDirective {

  constructor(
    private templateRef: TemplateRef<any>,
    private viewContainer: ViewContainerRef) { }

  @Input() set appUnless(condition: boolean) {
    if (!condition) {
      // 容器内插入模板
      this.viewContainer.createEmbeddedView(this.templateRef);
    }
    else {
      // 清除容器内模板
      this.viewContainer.clear();
    }

  }
}

app.component.ts

import { Component, ViewChild, OnInit } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: []
})
export class AppComponent {
  condition = true;
}

app.component.html

<button (click)="condition = !condition">toggle</button>

<div *appUnless="condition"></div>

<ng-template [appUnless]="condition">
  <p class="code unless">
    (A) &lt;ng-template [appUnless]="condition"&gt;
  </p>
</ng-template>

用法2

使用ViewContainerRef操作DOM

import { Component, ViewContainerRef, OnInit, ViewChild, ElementRef } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
// $implicit 使用默认值
  context = { $implicit: 'World', name: 'liyq' }

  @ViewChild('myTpl') tpl: ElementRef;

  constructor(
    private vr: ViewContainerRef
  ) { }

  ngOnInit() {
    // 实例化一个内嵌视图,并把它插入到该容器中。
    this.vr.createEmbeddedView(this.tpl, { name: 'nihao' });

    this.vr.get(0);

    // this.vr.clear();
  }
}

app.component.html


<ng-container *ngTemplateOutlet="myTpl; context: context"></ng-container>

<ng-template #myTpl let-name="name">
  <h2>this is myTpl {{ name }}</h2>
</ng-template>

结果展示
在这里插入图片描述

对不起,我理解错了您的要求。要使用ng-template来调用方法,您可以按照以下步骤操作: 1. 在组件中声明一个TemplateRef变量,并将其注入到构造函数中。例如: ```typescript constructor(private templateRef: TemplateRef<any>) { } ``` 2. 在模板中使用ng-template,并将其绑定到一个变量上。例如: ```html <ng-template #myTemplate> <button (click)="myMethod()">调用方法</button> </ng-template> ``` 3. 在组件中定义一个方法,该方法将使用ViewContainerRef来创建一个嵌入视图,并将ng-template作为参数传递给createEmbeddedView方法。例如: ```typescript import { ViewContainerRef } from '@angular/core'; myMethod() { this.viewContainerRef.clear(); this.viewContainerRef.createEmbeddedView(this.templateRef); } ``` 请注意,我还添加了`ViewContainerRef`作为依赖注入,并在`myMethod`方法中使用了`clear`方法来清除视图容器中的任何现有内容。 4. 在组件的模板中,使用`ng-container`来放置嵌入视图。例如: ```html <ng-container #container></ng-container> ``` 5. 在组件的类中,使用ViewChild装饰器来获取`ViewContainerRef`的引用。例如: ```typescript @ViewChild('container', { read: ViewContainerRef }) viewContainerRef: ViewContainerRef; ``` 这样,当调用`myMethod()`方法时,将会创建一个嵌入视图,并将ng-template的内容插入到`ng-container`中。 希望这样能满足您的要求!如果您还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值