我们可以使用ng-container, ng-template和ngTemplateOutlet 三者的配合,实现动态渲染某个模板视图的目的。

ng build之后,在Chrome开发者工具里看到ng文件夹下对应的html文件:

<ng-template #inputTemplate><input><h1>ngTemplateOutlet的用法</h1>
</ng-template><ng-container *ngTemplateOutlet="inputTemplate"></ng-container>

tNode指向源代码里的ng-container节点:

ngTemplateOutlet的实现:

/*** @ngModule CommonModule** @description** Inserts an embedded view from a prepared `TemplateRef`.** You can attach a context object to the `EmbeddedViewRef` by setting `[ngTemplateOutletContext]`.* `[ngTemplateOutletContext]` should be an object, the object's keys will be available for binding* by the local template `let` declarations.** @usageNotes* ```* <ng-container *ngTemplateOutlet="templateRefExp; context: contextExp"></ng-container>* ```** Using the key `$implicit` in the context object will set its value as default.** ### Example** {@example common/ngTemplateOutlet/ts/module.ts region='NgTemplateOutlet'}** @publicApi*/
@Directive({selector: '[ngTemplateOutlet]'})
export class NgTemplateOutlet implements OnChanges {private _viewRef: EmbeddedViewRef<any>|null = null;/*** A context object to attach to the {@link EmbeddedViewRef}. This should be an* object, the object's keys will be available for binding by the local template `let`* declarations.* Using the key `$implicit` in the context object will set its value as default.*/@Input() public ngTemplateOutletContext: Object|null = null;/*** A string defining the template reference and optionally the context object for the template.*/@Input() public ngTemplateOutlet: TemplateRef<any>|null = null;constructor(private _viewContainerRef: ViewContainerRef) {}ngOnChanges(changes: SimpleChanges) {const recreateView = this._shouldRecreateView(changes);if (recreateView) {const viewContainerRef = this._viewContainerRef;if (this._viewRef) {viewContainerRef.remove(viewContainerRef.indexOf(this._viewRef));}this._viewRef = this.ngTemplateOutlet ?viewContainerRef.createEmbeddedView(this.ngTemplateOutlet, this.ngTemplateOutletContext) :null;} else if (this._viewRef && this.ngTemplateOutletContext) {this._updateExistingContext(this.ngTemplateOutletContext);}}

还是老套路,在ngOnChanges里调用ViewContainerRef.createEmbeddedView:

更多Jerry的原创文章,尽在:“汪子熙”:

ng-template和ngTemplateOutlet相关推荐

  1. cannot bind to cxOutlet since it is not a known property of ng template

    我在SAP Spartacus处于运行状态(即ng serve)始终处于运行状态时,进行代码热修改,经常遇到此类错误消息 退出ng serve,重新执行即可: 更多Jerry的原创文章,尽在:&quo ...

  2. Angular 指令ngTemplateOutlet的运行原理单步调试

    看个具体的例子,我在Component html里用<ng container *ngTemplateOutlet定义了一个id为greet的template的插入点: #greet模板的内容: ...

  3. Angular NgTemplateOutlet的一个例子

    NgTemplateOutlet:Inserts an embedded view from a prepared TemplateRef. 语法: <ng-container *ngTempl ...

  4. 【Angular 基础入门】——知识点整合

    文章目录 快速入门 一.Angular 环境搭建 二.基本概念 模块简介 组件简介 服务与依赖注入 路由 三.基础教程 使用路由 自定义组件 常用结构型指令 事件绑定 模板引用 模板表达式中的运算符 ...

  5. ngzorro html源码,Angular 中 ngTemplateOutlet 的用法以及ng-zorro源码分析!

    一.引言 今天看到文章:https://segmentfault.com/a/1190000015944548 .于是专门研究一下ngTemplateOutlet用法!!!! 官方定义 : NgTem ...

  6. ng-template、ng-container、ng-content和ngTemplateOutlet、ngProjectAs傻傻分不清!他们究竟是干啥的???

    一句话描述5个关键词的作用: ng-template是备胎(模板):通常在html里面作为备用模板,当绑定了对应的#标记的时候才会显示 ng-container是舔狗(虚拟标签):包裹的内容显示,而自 ...

  7. 您需要了解有关Angular中的ng-template,ng-content,ng-container和* ngTemplateOutlet的所有信息...

    It was one of those days when I was busy working on new features for my office project. All a sudden ...

  8. 必须正确理解的---ng指令中的compile与link函数解析

    这个绝对是深入的知识,但看完之后,对NG的理解就很利害啦. http://www.ifeenan.com/angularjs/2014-09-04-%5B%E8%AF%91%5DNG%E6%8C%87 ...

  9. 关于施加在 div 标签上的 ngTemplateOutlet 指令让 div class 丢失的问题调试

    本文描述的应用代码地址:https://github.com/wangzixi-diablo/ngDynamic 问题描述 我在 div 标签页里使用 ngTemplateOutlet 给代码第 11 ...

最新文章

  1. 企业级java springcloud b2bc商城系统开源源码二次开发-负载均衡策略...
  2. 2019金融科技风往哪儿吹?蚂蚁金服联合20余家金融机构预测新年热点:5G、区块链上榜...
  3. tomcat手动发布
  4. angular 使用rxjs 监听同级兄弟组件数据变化
  5. python多线程调度_python并发编程之进程、线程、协程的调度原理(六)
  6. android折叠listview,android – 如何在listview中展开和折叠项目
  7. Android图片特效处理之图片叠加
  8. php反选全选代码,jQuery中实现全选,反选实例代码 (推荐)
  9. 华为Mate 30 Lite曝光:搭载麒麟810+20W快充
  10. 9款极具创意的HTML5/CSS3进度条动画
  11. PHP:函数赋参数默认初值
  12. include/autoconfig.mk
  13. 如何从零开始准备数学建模竞赛?
  14. 大卫科波菲尔优秀读后感范文4000字
  15. 2022年北京购房攻略二 (城区交通篇)
  16. 上海 三险一金 税后工资计算
  17. fastadmin-微信小程序实战课程:todolist项目文档(课件)整理汇总
  18. The OCD Brain: how animal research helps us understand a devastating condition
  19. 环境会计信息披露问题研究
  20. 毕业设计-模拟数据集生成笔记

热门文章

  1. 云将与行业走向深度融合
  2. JSON (一) JSON语法和数据类型
  3. UrlRewrite(URL重写)--ASP.NET中的实现
  4. Hadoop实战-中高级部分 之 Hadoop 集群安装
  5. 重置oracle 11G的system、sys密码
  6. java编程思想 学习笔记(2)
  7. 关于asp.net中partial,asp.net编译笔记
  8. 方立勋_30天掌握JavaWeb_Session
  9. Java性能调优之让程序“飞”起来-Java 代码优化
  10. SQL Server之体系结构