首页 > 语言 > JavaScript > 正文

详解Angular 自定义结构指令

2024-05-06 15:15:38
字体:
来源:转载
供稿:网友

1. <ng-template>元素

import { Component, TemplateRef, ViewContainerRef, ViewChild, AfterViewInit } from '@angular/core';@Component({ selector: 'app-code404', template: ` <!-- 这里使用一个模板变量,在组件中使用@ViewChild装饰器获取模板元素-->  <ng-template #tpl>   Big Keriy !  </ng-template> `,})export class Code404Component implements AfterViewInit{ // @ViewChild 装饰器获取模板元素 @ViewChild('tpl') tplRef: TemplateRef<any>; constructor(private vcRef: ViewContainerRef) {} ngAfterViewInit() {  // 使用ViewContainerRef对象的createEmbeddedView方法创建内嵌视图。  this.vcRef.createEmbeddedView(this.tplRef); } }

这样其实我们在视图中就得到了一个什么...啊,就是一个'Big Keriy !'的字符串。

2. ngTemplateOutlet指令

a. ngTemplateOutlet

和routerOutlet是一个意思,将视图(<ng-template>标签中的内容)放到对应的ngTemplateoutlet下面。

import { Component } from '@angular/core'; @Component({  selector: 'app-code404',  template: `   <ng-template #stpl>    Hello, Semlinker!   </ng-template>   <ng-template #atpl>    Big Keriy !   </ng-template>   <div [ngTemplateOutlet]="atpl"></div>   <div [ngTemplateOutlet]="stpl"></div>`, }) export class Code404Component { }

最终的视图应该是:

Big Keriy !
Hello, Semlinker!

b. ngOutletContex

看名字就知道意思。

ngTemplateOutlet指令基于TemplateRef对象,在使用ngTemplateOutlet指令时,可以通过ngTemplateOutletContext属性来设置来设置EmbeddedViewRef的上下文对象。可以使用let语法来声明绑定上下文对象属性名。

import { Component, TemplateRef, ViewContainerRef, ViewChild, AfterViewInit } from '@angular/core';@Component({ selector: 'app-code404', template: `  <!-- 这里的messagey映射到下面context中message 再使用插值表达式的方式显示message的值 -->  <ng-template #stpl let-message="message">   <p>{{message}}</p>  </ng-template>  <!-- 这里的messagey映射到下面context中message , let-msg是一种与语法糖的方式变量名是msg-->  <ng-template #atpl let-msg="message">   <p>{{msg}}</p>  </ng-template>  <!-- 若不指定变量值那么将显示 $implicit 的值-->  <ng-template #otpl let-msg>   <p>{{msg}}</p>  </ng-template>  <div [ngTemplateOutlet]="atpl"     // 这里ngOutletContext绑定的是context对象     [ngOutletContext]="context">  </div>  <div [ngTemplateOutlet]="stpl"     [ngOutletContext]="context">  </div>  <div [ngTemplateOutlet]="otpl"     [ngOutletContext]="context">  </div> `,})export class Code404Component implements AfterViewInit{ @ViewChild('tpl') tplRef: TemplateRef<any>; constructor(private vcRef: ViewContainerRef) {} ngAfterViewInit() {  this.vcRef.createEmbeddedView(this.tplRef); } context = { message: 'Hello ngOutletContext!',  $implicit: 'great, Semlinker!' };  // 这里的$implicit是固定写法}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选