本文介绍的应用代码地址:https://github.com/wangzixi-d...问题描述我在div标签页中使用ngTemplateOutlet,在代码的第11行,将一个新的模板实例动态传递给div标签,由变量inputTemplate表示。运行时发现第11行的div标签完全被传入的inputTemplate变量所代表的模板实例所取代——原来带有wrapper2类的div标签完全消失了。同时,另外一个偶然的发现,将div换成ng-content和ng-container,最终效果并没有什么区别。看起来ngTemplateOutlet将指向模板实例的布局,完全取代了应用ngTemplateOutlet的包装元素。问题分析在core.js的templateRef.createEmbeddedView中设置断点:触发断点后,切换到elements标签,发现第二个div标签根本看不到。然后在下面的代码中设置一个断点,也就是Angular的bootstrap阶段,让它暂停一下:返回compileNgModuleFactory(this.injector,options,moduleType).then(moduleFactory=>this.bootstrapModuleFactory(moduleFactory,options));}此时的HTML页面:只包含app-ng-template,也就是app.module.ts中指定的bootstrapComponent:我们可以注意这段代码生成的时机:这里执行模板输入的内联HTML模板:使用函数update??property一个HTML元素的属性:属性名是结构指令ngTemplateOutlet强加在div上,值为通过@Input传入的TemplateRef类型的模板实例:最后在Chrome开发者工具的elements标签页中看到的字段ng-reflect-ng-template-outlet的值为实际上是value.toString()调用的返回结果。解决方案如果不想让带有ngTemplateOutlet的元素消失,可以按照本文中的wrapperdiv,在宿主元素外包裹一个div元素,如下图:
