angular6.x中ngTemplateOutlet指令的使用示例


Posted in Javascript onAugust 09, 2018

在使用angular进行开发的时候,通过属性绑定向组件内部传值的方式,有时候并不能完全满足需求,比如我们写了一个公共组件,但是某个模板使用这个公共组件的时候,需要在其内部添加一些标签内容,这种情况下,除了使用ngIf/ngSwitch预先在组件内部定义之外,就可以利用ngTemplateOutlet指令向组件传入内容.

ngTemplateOutlet指令类似于angularjs中的ng-transclude,vuejs中的slot.

ngTemplateOutlet是结构型指令,需要绑定一个TemplateRef类型的实例.

使用方式如下:

@Component({
 selector: 'app',
 template: `
  <h1>Angular's template outlet and lifecycle example</h1>
  <app-content [templateRef]="nestedComponentRef"></app-content>
  <ng-template #nestedComponentRef let-name>
   <span>Hello {{name}}!</span>
   <app-nested-component></app-nested-component>
  </ng-template>
 `,
})
export class App {}
@Component({
 selector: 'app-content',
 template: `
  <button (click)="display = !display">Toggle content</button>
  <template 
    *ngIf="display" 
    *ngTemplateOutlet="templateRef context: myContext">
  </template>
 `,
})
export class Content {
 display = false;
 @Input() templateRef: TemplateRef;
 myContext = {$implicit: 'World', localSk: 'Svet'};
}
@Component({
 selector: 'app-nested-component',
 template: `
  <b>Hello World!</b>
 `,
})
export class NestedComponent implements OnDestroy, OnInit {
 
 ngOnInit() {
  alert('app-nested-component initialized!');
 }
 
 ngOnDestroy() {
  alert('app-nested-component destroyed!');
 }
 
}

代码中除了跟组件外定义了两个组件

  1. 容器组件:app-content
  2. 传递进去的内容组件:app-nested-component

app-content组件接收一个TemplateRef类型的输入属性templateRef,并在模板中将其绑定到了ngTemplateOutlet指令,当组件接收到templateRef属性时,就会将其渲染到ngTemplateOutlet指令所在的位置.

上例中,app-content组件templateRef属性的来源,是在根组件的模板内,直接通过#符号获取到了app-nested-component组件所在<ng-template>的引用并传入的.

在实际应用中,除了这种方式,也可以直接在组件内部获取TemplateRef类型的属性并绑定到ngTemplateOutlet指令.

比如在容器组件为模态框的情况下,并不能通过模板传值,就可以使用下面这种方式:

@ViewChild('temp') temp: TemplateRef<any>

 openDialog(){
  this.dialog.open(ViewDialogComponent, {data: this.temp)
 }

在容器组件中还可以定义被传递内容的上下文(上例app-content组件中的myContext属性),其中的$implicit属性作为默认值,在被传递的内容中可以以重命名的方式访问(上例let-name),对于上下文中其他的属性,就需要通过let-属性名的方式访问了.

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

Javascript 相关文章推荐
javascript针对DOM的应用分析(二)
Apr 15 Javascript
JS实现将人民币金额转换为大写的示例代码
Feb 13 Javascript
判断是否存在子节点的实现代码
May 18 Javascript
超实用的JavaScript代码段 附使用方法
May 22 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
Angular2 http jsonp的实例详解
Aug 31 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
Sep 14 Javascript
JS点击动态添加标签、删除指定标签的代码
Apr 18 Javascript
微信小程序仿知乎实现评论留言功能
Nov 28 Javascript
JS实现马赛克图片效果完整示例
Apr 13 Javascript
JavaScript中作用域链的概念及用途讲解
Aug 06 Javascript
koa上传excel文件并解析的实现方法
Aug 09 #Javascript
使用layer弹窗和layui表单实现新增功能
Aug 09 #Javascript
vue-cli初始化项目中使用less的方法
Aug 09 #Javascript
video.js 实现视频只能后退不能快进的思路详解
Aug 09 #Javascript
JavaScript面向对象继承原理与实现方法分析
Aug 09 #Javascript
vue使用ajax获取后台数据进行显示的示例
Aug 09 #Javascript
vue中Axios的封装与API接口的管理详解
Aug 09 #Javascript
You might like
ThinkPHP标签制作教程
2014/07/10 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
Node.js学习入门
2017/01/03 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
python开发入门——set的使用
2020/09/03 Python
python实现按日期归档文件
2021/01/30 Python
最新销售员个人自荐信
2013/09/21 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
一岗双责责任书
2014/04/15 职场文书
工程项目经理任命书
2014/06/05 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
浅谈Python项目的服务器部署
2021/04/25 Python
python 进阶学习之python装饰器小结
2021/09/04 Python
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android