全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Angular 自定义结构指令

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是固定写法
}

先看输出的视图:

Hello ngOutletContext!
Hello ngOutletContext!
Hello, Semlinker!

3. ngComponentOutlet指令

听着名字就很爽,这不是插入视图的,是插入组件的!

该指令使用声明的方式,动态加载组件。

先写组件,里面有两个。。组件:

 @Component({
  selector: 'alert-success',
  template: `
   <p>Alert success</p>
  `,
 })
 export class AlertSuccessComponent { }
 @Component({
  selector: 'alert-danger',
  template: `
   <p>Alert danger</p>
  `,
 })
 export class AlertDangerComponent { }
 @Component({
  selector: 'my-app',
  template: `
   <h1>Angular version 4</h1>
   <ng-container *ngComponentOutlet="alert"></ng-container>
   <button (click)="changeComponent()">Change component</button>
 `, })
 export class AppComponent {
   alert = AlertSuccessComponent;
  changeComponent() {
   this.alert = AlertDangerComponent;
 } 
}

当然,还需要在模块中声明入口:

// app.module.ts
@NgModule({
  // ...
  declarations: [
   AppComponent,
   SignUpComponent,
   AlertSuccessComponent,
   AlertDangerComponent
  ],
  entryComponents: [    // 这里面写指令中呀用到的组件
   AlertSuccessComponent,
   AlertDangerComponent
],
// ...
})

这样就可以使用ngComponentOutlet指令来插入组件玩耍了:

<!-- 简单语法 -->
<ng-container *ngComponentOutlet="componentTypeExpression"></ng-container>

<!-- 完整语法 -->
<ng-container *ngComponentOutlet="componentTypeExpression;
   injector: injectorExpression;
   content: contentNodesExpression;">
</ng-container>

这是一个完整语法简单的例子:

// ...
@Component({
 selector: 'ng-component-outlet-complete-example',
 template: `
  <ng-container *ngComponentOutlet="CompleteComponent; 
                   injector: myInjector; 
                   content: myContent"></ng-container>`
})
class NgTemplateOutletCompleteExample {
 // This field is necessary to expose CompleteComponent to the template.
 CompleteComponent = CompleteComponent;
 myInjector: Injector;

 myContent = [[document.createTextNode('Ahoj')], [document.createTextNode('Svet')]];

 constructor(injector: Injector) {
  this.myInjector = ReflectiveInjector.resolveAndCreate([Greeter], injector);
 }
}

4. 创建结构指令

也想不出来一个什么好例子,抄一个例子过来:

// uless.directive.ts

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
 @Directive({
   selector: '[exeUnless]'
 })
 export class UnlessDirective {
   @Input('exeUnless')
   set condition(newCondition: boolean) { // set condition
     if (!newCondition) {
       this.viewContainer.createEmbeddedView(this.templateRef);
     } else {
       this.viewContainer.clear();
     } 
   }
   constructor(private templateRef: TemplateRef<any>,
     private viewContainer: ViewContainerRef) {
   } 
 }


 import { Component } from '@angular/core';
 @Component({
  selector: 'app-root',
  template: `
   <h2 *exeUnless="condition">Hello, Semlinker!</h2>
  `,
 })
 export class AppComponent {
  condition: boolean = false;
 }


 // app.component.ts

 import { Component } from '@angular/core';
 @Component({
  selector: 'app-root',
  template: `
   <h2 *exeUnless="condition">Hello, Semlinker!</h2>
  `,
 })
 export class AppComponent {
  condition: boolean = false;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Angular  # 自定义结构指令  # 结构指令  # Angular 2.x学习教程之结构指令详解  # 详解angular2 控制视图的封装模式  # 浅谈Angular 观察者模式理解  # angular 服务的单例模式(依赖注入模式下)详解  # Angular指令之restict匹配模式的详解  # Angular中的结构指令模式及使用详解  # 绑定  # 的是  # 是一个  # 是一种  # 要在  # 这是一个  # 可以通过  # 这不是  # 可以使用  # 也想  # 这里面  # 若不  # 中就  # 还需  # 先看  # 大家多多  # 就可以  # 内嵌  # 很爽  # 应该是 


相关文章: 小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  如何通过商城自助建站源码实现零基础高效建站?  建站之星CMS五站合一模板配置与SEO优化指南  如何在Windows 2008云服务器安全搭建网站?  建站10G流量真的够用吗?如何应对访问高峰?  动图在线制作网站有哪些,滑动动图图集怎么做?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  视频网站制作教程,怎么样制作优酷网的小视频?  设计网站制作公司有哪些,制作网页教程?  网站微信制作软件,如何制作微信链接?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何在腾讯云免费申请建站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  建站主机核心功能解析:服务器选择与网站搭建流程指南  建站之星好吗?新手能否轻松上手建站?  如何零基础在云服务器搭建WordPress站点?  如何快速生成专业多端适配建站电话?  如何用AWS免费套餐快速搭建高效网站?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  建站之星×万网:智能建站系统+自助建站平台一键生成  建站之星云端配置指南:模板选择与SEO优化一键生成  如何在腾讯云服务器快速搭建个人网站?  大连 网站制作,大连天途有线官网?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何高效配置香港服务器实现快速建站?  建站主机选购指南与交易推荐:核心配置解析  如何配置支付宝与微信支付功能?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何在香港服务器上快速搭建免备案网站?  如何在景安服务器上快速搭建个人网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  广州建站公司哪家好?十大优质服务商推荐  外贸公司网站制作哪家好,maersk船公司官网?  网站制作新手教程,新手建设一个网站需要注意些什么?  如何通过建站之星自助学习解决操作问题?  建站之星如何实现五合一智能建站与营销推广?  ,制作一个手机app网站要多少钱?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  如何在阿里云购买域名并搭建网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  想学网站制作怎么学,建立一个网站要花费多少?  建站之星如何快速解决建站难题?  建站之星2.7模板:企业网站建设与h5定制设计专题  招贴海报怎么做,什么是海报招贴?  如何规划企业建站流程的关键步骤? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。