详解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 相关文章推荐
一个级联菜单代码学习及removeClass与addClass的应用
Jan 24 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
Feb 25 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
Feb 19 Javascript
JS实现从表格中动态删除指定行的方法
Mar 31 Javascript
js完美解决IE6不支持position:fixed的bug
Apr 24 Javascript
js操作数组函数实例小结
Dec 10 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
Nov 02 Javascript
JS实现为动态创建的元素添加事件操作示例
Mar 17 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
Jan 31 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
Oct 31 Javascript
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
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
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
关于php中一些字符串总结
2016/05/05 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
document.write的几点使用心得
2014/05/14 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
一百行python代码将图片转成字符画
2021/02/19 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
法院实习人员自我鉴定
2013/09/26 职场文书
工程造价管理专业大专生求职信
2013/10/06 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
关于保护环境的标语
2014/06/09 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
2015入党自荐书范文
2015/03/05 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
SQL中的三种去重方法小结
2021/11/01 SQL Server