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 相关文章推荐
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 Javascript
iframe高度自适应及隐藏滚动条的实例详解
Sep 29 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
Aug 13 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
js 将线性数据转为树形的示例代码
May 28 Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
Oct 26 jQuery
Jquery ajax书写方法代码实例解析
Jun 12 jQuery
vscode中Vue别名路径提示的实现
Jul 31 Javascript
基于javascript的无缝滚动动画1
Aug 07 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 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
?繁体转换的class
2006/10/09 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
js时间控件只显示年月
2017/01/08 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
微信小程序自定义组件
2017/08/16 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
Python脚本实现12306火车票查询系统
2016/09/30 Python
Python内置函数OCT详解
2016/11/09 Python
Python之os操作方法(详解)
2017/06/15 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
使用python生成目录树
2018/03/29 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
医学生自我评价
2014/01/27 职场文书
装配出错检讨书
2014/09/23 职场文书
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers