源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

详解Angular 4.x NgTemplateOutlet

  • 时间:2020-04-15 11:40 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:详解Angular 4.x NgTemplateOutlet
该指令用于基于已有的 [code]TemplateRef [/code]对象,插入对应的内嵌视图。在应用 NgTemplateOutlet 指令时,我们可以通过 [code][ngTemplateOutletContext] [/code]属性来设置 [code]EmbeddedViewRef [/code]的上下文对象。绑定的上下文应该是一个对象,此外可通过 [code]let [/code]语法来声明绑定上下文对象属性名。 友情提示:若 let 语法未绑定任何属性名,则上下文对象中 $implicit 属性,对应的值将作为默认值。 [b]NgTemplateOutlet 指令语法[/b]
[url=http://www.1sucai.cn/article/112123.htm]Angular 4.x 动态创建组件[/url] 文章中我有话说版块。 [b]NgTemplateOutlet 源码分析 [/b] [b]NgTemplateOutlet 指令定义[/b]
@Directive({
 selector: '[ngTemplateOutlet]'
})
[b]NgTemplateOutlet 类私有属性及构造函数[/b]
export class NgTemplateOutlet implements OnChanges {
 // 表示创建的内嵌视图
 private _viewRef: EmbeddedViewRef<any>; 
 // 注入ViewContainerRef实例
 constructor(private _viewContainerRef: ViewContainerRef) {}
}
[b]NgTemplateOutlet 类输入属性[/b]
@Input() public ngTemplateOutletContext: Object; // 用于设定EmbeddedViewRef上下文
@Input() public ngTemplateOutlet: TemplateRef<any>; // 用于设定TemplateRef对象
[b]NgTemplateOutlet 指令声明周期[/b]
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);
 }
 }
}
[code]ngTemplateOutlet [/code]指令的源码相对比较简单,如果读者有兴趣了解 [code]createEmbeddedView() [/code]方法的内部实现,可以参考 [url=http://%20Angular%204.x%20NgIf]Angular 4.x NgIf [/url]文章中的相关内容。 另外需要注意的是使用 [code]let [/code]语法创建模板局部变量,若未设置绑定的值,则默认是上下文对象中[code] $implicit [/code]属性对应的值。为什么属性名是[code] $implicit [/code]呢?因为 Angular 不知道用户会如何命名,所以定义了一个默认的属性名。 即[code] let-name="$implicit" [/code]与[code] let-name [/code]是等价的。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部