Angular 2+ 服务何时提供
Posted
技术标签:
【中文标题】Angular 2+ 服务何时提供【英文标题】:When does the Angular 2+ service get provided 【发布时间】:2018-12-14 03:25:39 【问题描述】:我已经阅读了很多关于 Angular 依赖注入系统的内容,但似乎仍然无法找到一个非常具体的问题的答案。
通过@Module
的providers: []
数组注册的提供程序被模块的当前(最近的父级)注入器“拾取”。它们通常会在根注入器中注册,除非模块是延迟加载的,它会创建一个单独的注入上下文,其工作方式类似于 块(外部提供程序可在内部访问,反之亦然,内部提供程序优先) .如果提供程序注册在@Component
的providers: []
数组中,它们也会被注入到单独的上下文中,该上下文仅包括组件本身及其子组件。
然而,@Service()
装饰器中注册的服务会发生什么对我来说是个谜。如果该服务从未在任何地方使用过怎么办?或者如果@Service(providedIn: root)
仅用于延迟加载模块怎么办?如果是providedIn: SomeLazyLoadedModule
呢?模块的providers
数组中是否应该提及此类服务?
我能找到的关于该主题的唯一具体信息是“AOT 编译器可能会执行一些优化,例如摇树”,老实说,这并没有真正澄清很多。
如果上述某些陈述有误,请随时纠正我。
【问题讨论】:
【参考方案1】:首先,没有@Service
装饰器。它被命名为@Injectable
。
如果您仅使用@Injectable()
来装饰服务,那么它不会在任何地方提供,除非您将其添加到模块或组件的providers
数组中。
如果你用@Injectable( providedIn: 'root' )
装饰它,那么它是在根模块中提供的,即相当于将它添加到根模块的providers数组中除了这样可以完全忽略服务如果它从未注入任何地方,则不要将其添加到任何捆绑包中:在这种情况下,由于它不在任何其他 TypeScript 文件的导入中,它可以被摇树:没有使用该服务,因此捆绑它是无用的。
如果你用@Injectable( providedIn: SomeModule )
装饰它,那么它是在模块SomeModule中提供的,即相当于将它添加到模块SomeModule的providers数组中,与上面相同的例外,即如果没有导入它,它可以是摇摇欲坠。
【讨论】:
谢谢,这很有帮助。尤其是在阅读了更多文档之后;)以上是关于Angular 2+ 服务何时提供的主要内容,如果未能解决你的问题,请参考以下文章