详解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 相关文章推荐
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
Jquery实现鼠标移动放大图片功能实例
Mar 25 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
Jun 01 Javascript
jquery实现漂亮的二级下拉菜单代码
Aug 26 Javascript
js正则表达式注册页面表单验证
Oct 11 Javascript
js实现上传图片预览方法
Oct 25 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
Jul 12 Javascript
vue登录注册及token验证实现代码
Dec 14 Javascript
vue脚手架及vue-router基本使用
Apr 09 Javascript
Vue.js实现的表格增加删除demo示例
May 22 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 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
如何对PHP程序中的常见漏洞进行攻击
2006/10/09 PHP
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
使用Python设计一个代码统计工具
2018/04/04 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
Python读取表格类型文件代码实例
2020/02/17 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
办理居住证介绍信
2014/01/15 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
交通安全横幅标语
2014/10/07 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python