详解Angular 4.x NgTemplateOutlet


Posted in Javascript onMay 24, 2017

该指令用于基于已有的 TemplateRef 对象,插入对应的内嵌视图。在应用 NgTemplateOutlet 指令时,我们可以通过 [ngTemplateOutletContext] 属性来设置 EmbeddedViewRef 的上下文对象。绑定的上下文应该是一个对象,此外可通过 let 语法来声明绑定上下文对象属性名。

友情提示:若 let 语法未绑定任何属性名,则上下文对象中 $implicit 属性,对应的值将作为默认值。

NgTemplateOutlet 指令语法

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

NgTemplateOutlet 使用示例

@Component({
 selector: 'ng-template-outlet-example',
 template: `
 <ng-container *ngTemplateOutlet="greet"></ng-container>
 <hr>
 <ng-container *ngTemplateOutlet="eng; context: myContext"></ng-container>
 <hr>
 <ng-container *ngTemplateOutlet="svk; context: myContext"></ng-container>
 <hr>
 <ng-template #greet><span>Hello</span></ng-template>
 <ng-template #eng let-name><span>Hello {{name}}!</span></ng-template>
 <ng-template #svk let-person="localSk"><span>Ahoj {{person}}!</span></ng-template>
`
})
class NgTemplateOutletExample {
 myContext = {$implicit: 'World', localSk: 'Svet'};
}

基础知识

TemplateRef

TemplateRef 实例用于表示模板对象。

ViewContainerRef

ViewContainerRef 实例提供了 createEmbeddedView() 方法,该方法接收 TemplateRef 对象作为参数,并将模板中的内容作为容器 (comment 元素) 的兄弟元素,插入到页面中。

<ng-template>

<ng-template> 用于定义模板,使用 * 语法糖的结构指令,最终都会转换为 <ng-template> 模板指令,模板内的内容如果不进行处理,是不会在页面中显示。

<ng-container>

<ng-container> 是一个逻辑容器,可用于对节点进行分组,但不作为 DOM 树中的节点,它将被渲染为 HTML中的 comment 元素,它可用于避免添加额外的元素来使用结构指令。

若想进一步了解 <ng-template> <ng-container> 的区别,请参考Angular 4.x 动态创建组件 文章中我有话说版块。

NgTemplateOutlet 源码分析

NgTemplateOutlet 指令定义

@Directive({
 selector: '[ngTemplateOutlet]'
})

NgTemplateOutlet 类私有属性及构造函数

export class NgTemplateOutlet implements OnChanges {
 // 表示创建的内嵌视图
 private _viewRef: EmbeddedViewRef<any>; 
 // 注入ViewContainerRef实例
 constructor(private _viewContainerRef: ViewContainerRef) {}
}

NgTemplateOutlet 类输入属性

@Input() public ngTemplateOutletContext: Object; // 用于设定EmbeddedViewRef上下文
@Input() public ngTemplateOutlet: TemplateRef<any>; // 用于设定TemplateRef对象

NgTemplateOutlet 指令声明周期

export class NgTemplateOutlet implements OnChanges {
 ngOnChanges(changes: SimpleChanges) {
 // 若this._viewRef已存在,则先从视图容器中对应的位置移除该视图。
 if (this._viewRef) {
  this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._viewRef));
 }
 // 若this.ngTemplateOutlet输入属性有绑定TemplateRef对象,则基于设定的上下文对象创建内嵌视图
 if (this.ngTemplateOutlet) {
  this._viewRef = this._viewContainerRef.createEmbeddedView(
   this.ngTemplateOutlet, this.ngTemplateOutletContext);
 }
 }
}

ngTemplateOutlet 指令的源码相对比较简单,如果读者有兴趣了解 createEmbeddedView() 方法的内部实现,可以参考 Angular 4.x NgIf 文章中的相关内容。

另外需要注意的是使用 let 语法创建模板局部变量,若未设置绑定的值,则默认是上下文对象中 $implicit 属性对应的值。为什么属性名是 $implicit 呢?因为 Angular 不知道用户会如何命名,所以定义了一个默认的属性名。 即 let-name="$implicit" let-name 是等价的。

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

Javascript 相关文章推荐
jQuery获取样式中颜色值的方法
Jan 29 Javascript
Bootstrap每天必学之面板
Nov 30 Javascript
基于BootStarp的Dailog
Apr 28 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
Jun 12 Javascript
JavaScript基础之this详解
Jun 04 Javascript
详解vue-router2.0动态路由获取参数
Jun 14 Javascript
完美实现js拖拽效果 return false用法详解
Jul 28 Javascript
javascript Function函数理解与实战
Dec 01 Javascript
Angular4 反向代理Details实践
May 30 Javascript
一些可能会用到的Node.js面试题
Jun 15 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
基于angular实现树形二级表格
Oct 16 Javascript
javascript简单写的判断电话号码实例
May 24 #Javascript
Angular2搜索和重置按钮过场动画
May 24 #Javascript
深入理解react-router@4.0 使用和源码解析
May 23 #Javascript
angularjs中ng-bind-html的用法总结
May 23 #Javascript
vue.js实现价格格式化的方法
May 23 #Javascript
js编写选项卡效果
May 23 #Javascript
jQuery日期范围选择器附源码下载
May 23 #jQuery
You might like
拼音码表的生成
2006/10/09 PHP
php的计数器程序
2006/10/09 PHP
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
python访问类中docstring注释的实现方法
2015/05/04 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Django异步任务线程池实现原理
2019/12/17 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
10张动图学会python循环与递归问题
2021/02/06 Python
三星英国官网:Samsung英国
2018/09/25 全球购物
社区班子对照检查材料
2014/08/27 职场文书
车间质检员岗位职责
2015/04/08 职场文书