何时将Service注入Angular 2模块级别和App组件级别

时间:2017-03-09 11:59:22

标签: angular dependency-injection

我一直在观看PluralSight中的Angular 2入门,我看到创建的一些服务被注入App组件和模块组件。

这里的例子:

在Angular 2中创建RouterGuard时,创建的RouterGuard服务将注入模块级别,但某些自定义服务仅注入App Component级别。我的问题是,我什么时候应该向Module级别注入一个服务,何时只注入App组件级别。

谢谢!

1 个答案:

答案 0 :(得分:12)

实际上,您可以在模块级别和组件级别提供服务。您可以在模块级别提供服务,方法是将其列在NgModule的providers数组中,如下所示:

@NgModule({
    declarations: [
        ...
    ],
    imports: [
        ...
    ],
    providers: [MyService],
    bootstrap: [AppComponent]
})

执行此操作时,您将在整个模块和所有子项中提供相同实例

但是,有时,您可能希望为组件提供单独的服务实例。在这种情况下,您可以通过在组件装饰器中的providers数组中列出它来在组件级别提供服务,如下所示:

@Component({
    templateUrl: './app.component.html',
    providers: [MyService]
})

这为该组件提供了一个新的服务实例。

当您想要在模块级别提供服务时,您将使用服务来保存多个组件共享的数据。这可以使用存储在服务中但由多个组件使用的变量或可观察对象。另一次你想要在Module级别提供服务的是你的服务是无状态的(只返回来自Http调用的observable)。在这些场景中,拥有共享实例是有意义的。

其他时候,您可能希望提供同时保存数据的服务,但您希望每个组件都拥有自己的实例。在这种情况下,在组件级别提供服务是有意义的。

希望有所帮助。