一、模块
1、特性模块: 纯业务模块,一个顶级组件下挂很多子组件,大部分由declarations组成, 只导出顶出组件,若有服务的生命周期必须和模块相同。
2、路由特性模块:顶级组件只用作导航使用(懒加载),不会导出任何东西,不会被任何模块导入
3、路由模块
4、服务模块,不应该有声明对象,只应该由根组件导入
特性模块 |
声明 |
提供商 |
导出什么 |
被谁导入 |
---|---|---|---|---|
领域 |
有 |
罕见 |
顶级组件 |
特性模块,AppModule |
路由特性 |
有 |
罕见 |
无 |
无 |
路由 |
无 |
是(守卫) |
RouterModule |
特性(供路由使用) |
服务 |
无 |
有 |
无 |
AppModule |
窗口部件 |
有 |
罕见 |
有 |
特性 |
entrycomponent入口组件,Angular 编译器只会为那些可以从 entryComponents
中直接或间接访问到的组件生成代码
提供商就相当于说明书,用来指导 DI 系统该如何获取某个依赖的值。
服务导入,优先是prividedin:"root"
注入器树:平台root、ngModule、组件
如果某个模块是惰性加载的,那么请使用 @NgModule()
的 provides
选项
为什么 Angular 不能像主动加载模块那样把惰性加载模块的提供商也添加到应用程序的根注入器中呢?为什么会出现这种不一致?
归根结底,这来自于 Angular 依赖注入系统的一个基本特征: 在注入器还没有被第一次使用之前,可以不断为其添加提供商。 一旦注入器已经创建和开始交付服务,它的提供商列表就被冻结了,不再接受新的提供商。
,应用逻辑开始惰性加载某个模块。 Angular 必须把这个惰性加载模块中的提供商添加到某个注入器中。 但是它无法将它们添加到应用的根注入器中,因为根注入器已经不再接受新的提供商了。 于是,Angular 在惰性加载模块的上下文中创建了一个新的子注入器。
在NgModule配置Provider与在服务的ProviderIn配置,没有多少不同,服务的ProviderIn,主要的区别是如果 NgModule 没有用到该服务,那么它就是可以被摇树优化掉的。 对于某个提供特定服务的库而言,有些组件可能会希望注入器是可选的,等使用该库的应用程序来决定是否要提供该服务。
NgModule,但以 providers
形式提供的服务无法被摇树优化。
如果你在 AppModule
的 @NgModule()
元数据中配置了全应用级的提供商,它就会覆盖通过 @Injectable()
配置的那一个
提供单例服务3种方式