何时提供Angular 2+服务

时间:2018-07-05 15:14:19

标签: angular javascript-framework web-frameworks

我已经阅读了很多有关Angular依赖注入系统的信息,但似乎仍然找不到一个非常具体的问题的答案。

通过@Module的{​​{1}}数组注册的提供程序由模块的当前(最接近的父级)注入器“拾取”。它们通常将在根注入器中注册,除非模块是延迟加载的,这会创建一个单独的注入上下文,该注入上下文的工作方式类似于{}块(外部提供程序可在内部访问,反之亦然,内部提供程序优先) 。如果提供者在providers: []的{​​{1}}数组中注册,它们也将被注入单独的上下文中,该上下文仅包括组件本身及其子组件。

@Component装饰器中注册的服务发生了什么,对我来说还是个谜。如果该服务从未在任何地方使用该怎么办?还是仅在延迟加载的模块中使用providers: []怎么办?如果是@Service(),该怎么办?并且是否应该在模块的@Service({providedIn: root})数组中提及此类服务?

我能在该主题上找到的唯一具体信息是“ AOT编译器可能会执行诸如摇树之类的某些优化”,说实话,这并没有真正弄清楚。

如果上述某些陈述有误,请随时纠正我。

1 个答案:

答案 0 :(得分:3)

首先,没有@Service装饰器。它名为@Injectable

如果仅用@Injectable()装饰服务,则除非将其添加到模块或组件的providers数组中,否则不会在任何地方提供该服务。

如果您用@Injectable({ providedIn: 'root' })装饰它,那么它将在根模块中提供,即等同于将其添加到根模块的提供者数组中。服务,并且不要将其添加到任何捆绑包中(如果它从未注入过任何地方):在这种情况下,由于它不在任何其他TypeScript文件的导入中,因此它可能会摇摇欲坠:没有任何东西使用该服务,因此将其捆绑是没有用的。 >

如果您用@Injectable({ providedIn: SomeModule })装饰它,那么它将在SomeModule模块中提供,即等同于将其添加到SomeModule模块的providers数组中,与上面相同的例外,即如果没有导入,它将可能摇摇欲坠。