模板选择器直接实例化组件:html
解释:根据已建立的组件工厂进行组件实例化,无须动态生成宿主元素(标签)git
动态组件(工厂模式实例化组件)github
解释:根据已经声明的组件(静态类d.ts)建立组件工厂再进行组件实例化,宿主元素(标签)经过Host文件生成typescript
先说场景:编程
(1)NG官网的例子一个广告位须要多个不一样布局的页面进行切换,若是用ngIf,你就只能写死多个模板在父组件里(静态)。bootstrap
(2)tab页切换,能够用上图动态组件生成的例子;(scm系统和wms系统的tab页看上去是路由锚点控制页面切换,但实际也是披着动态组件的羊毛)segmentfault
二者对比:api
(1)展示方面:没任何差异angular2
(2)工做量:二者其实没什么差异,但同在一个父组件下基本都是传相同的参数值,那么你宁愿一个个写在模板上,仍是写在方法里一劳永逸?app
(3)性能:ngIf——我第一时间就想到了ngIf带来的注释模板,页面的变化都要进行变化检测,模板有多个ngIf模板就会屡次判断(强行解释);其次这种懒加载方式能减小bundle的体积,加快首屏渲染速度
子问题1:enterComponents和声明组件区别? 答:declarations——经过模板的selector建立组件,即声明并建立;entryComponents——声明不建立,等到用的时候才经过离线模板编译器(OTC)根据entryComponents List的内容编译已声明的组件建立工厂,Angular使用entryComponents来启用“tree shaking”,即只编译项目中实际使用的组件,而不是编译全部在ngModule中声明但从未使用的组件,enterComponents在ng里有三种表现形式,
@NgModule.bootstrap
里声明的启动组件,如AppComponent。
扩展:
一句话分析这张图片:ng的组件都是经过工厂函数(ComponentFactory<comp>)实例化出来,ngFactory.js文件负责装载组件模板及变化检测代码片断等静态数据,变量早已经在编译过程前开辟好内存空间,一切渲染过程都是以此为媒介。剩下的就是coder的选择是否用动态组件的方式加载,若是选用动态组件方式一定通过entryComponents的记录,当页面要加载这个组件时会OTC编译声明好的组件同时建立ngFactory.js 和 _Host_[x].ngFactory.js,前者渲染页面(考虑IOS和Android)后者负责生成宿主元素,这个就是一个动态组件编译过程。
其余:动态组件考点不止这些,还有装饰器@XXX、元数据的传入能够参考 Implementing custom component decorator ,
问题2:ng的依赖注入在软件开发解决什么?
答:依赖注入(Dependence Inject)是控制反转(Inversion of Control 后)的行为。
控制反转——好莱坞的法则:“don‘t call us, we‘ll call you”。
紧耦合,谁也不能缺乏谁,对象或者模块间经过互new的形式存在
实际场景,复杂且很差管理。
引入第三方把相应的对象/类(ng以服务形式存在)统一管理,并按需注入
最后,达到解耦的理想状态
问题3:依赖注入不单单是调用服务,实战还有更多新玩法。
概念篇——一、建立服务过程选择@Injectable、@NgModule 仍是 @Component ?
二、provider入口API及各类提供商(useClass比较常见,适用于内部固定,外部变化多。useFactory对于权限控制即时变动状态场景有用)
三、每一个组件建立一个注入器实例,服务实例在应用中是注册屡次仍是仅有一次,是根据注入形式不一样前者是@Component.provider后者是AppModule.provider (举例:多种编辑会话,每一个组件须要一个特定的服务进行管理表单的新值和旧值,这种状况必须使用@Component.provider,你能够理解为AppModule.provider注册的就只有一个对象(单例),根模块的提供商是向下传递到有须要用到该服务的组件中,而@Component.provider是为每一个组件实例化独立的服务)
实践篇——一、组件能够经过注入器,把本身注入到子组件上(服务=类)
二、类-接口写法{provider: virtual, useClass: realClass},为了节省内存,同时做为Token而存在
三、出现引用循环,当即想到[{ provide: Parent, useExisting: forwardRef(() => AlexComponent) }]
四、仅找上一级的注入器服务添加@Host() 在服务建立前写 @Host() private heroCache: HeroCacheService,防止服务没找到用@Optional()
疑问:angular既然选择了AOT编译,那么离线模板编译器(OTC)在客户端是以什么形式存在?代码片断?
动态组件模块相关文章
Angular进阶:Angular编译机制(AOT、JIT)
Implementing custom component decorator