【问题标题】:When to inject a SERVICE to Angular 2 Module level and App Component Level何时将服务注入 Angular 2 模块级别和应用程序组件级别
【发布时间】:2017-07-30 09:50:14
【问题描述】:

我一直在看 Angular 2 Getting Started in PluralSight,我看到一些创建的服务被注入到 App Component 和 Module Component 中。

这是一个例子:

在 Angular 2 中创建 RouterGuard 时,为 RouterGuard 创建的服务注入到模块级别,但一些自定义服务仅注入到应用程序组件级别。我的问题是,我应该什么时候将服务注入到模块级别,什么时候只注入到 App 组件级别。

谢谢!

【问题讨论】:

    标签: angular dependency-injection


    【解决方案1】:

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

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

    当您这样做时,您将在整个模块和所有子模块中提供相同的实例

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

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

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

    您希望在模块级别提供服务的一个示例是,您将使用服务来保存由多个组件共享的数据。这可以使用存储在服务中但由多个组件使用的变量或可观察对象。如果您的服务是无状态的(仅从 Http 调用返回 observables),您可能希望在模块级别提供服务。在这些情况下,拥有一个共享实例是有意义的。

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

    希望对您有所帮助。

    【讨论】:

    • 我会在模块或应用程序级别说“提供”。注入是注入器在创建实例并将值传递给构造函数时所做的事情。
    • 确实如此。我可能过度简化了这个概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2017-07-08
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多