【问题标题】:Using Angular to declare a new service instance per module?使用 Angular 为每个模块声明一个新的服务实例?
【发布时间】:2018-07-30 13:16:15
【问题描述】:

我正在使用角度。我已经知道,当一个 appmodule 正在导入声明 providers 的模块时,根注入器会获取所有这些并且该服务对应用程序是可见的 - 全局。 (我不是在谈论延迟加载的模块

但是每个module 是否有可能拥有自己的服务实例?

我想到了可能是这样的:

@NgModule({
    providers: [AService]
})
class A {
    forRoot() {
        return {
            ngModule: A,
            providers: [AService]
        }
    }

    forChild() {
        return {
            ngModule: A,
            providers: [AService]
        }
    }
}

但我不知道这样做是否正确

问题

如何完成每个模块的服务?

STACKBLITZ : from my testing , they are using the same service instance

【问题讨论】:

    标签: javascript angular


    【解决方案1】:

    当我们在急切加载的功能模块中提供服务时 通过我们应用程序的根模块,它可供所有人注入。 - John Papa

    看起来没有办法在功能模块级别进行注入,因为除了根模块之外没有其他模块级别的注入器。

    但是 angular 在注入器的每个组件级别都有节点,所以我猜这种情况将不得不使用 coponent level-injectors。

    您还可以让父组件为共享同一实例的不同子组件注入服务。

    一种方法是在组件级别提供服务。不确定这是否适合您。

    另外,请查看multiple edit scenario in the docs

    https://angular-iayenb.stackblitz.io

    import { Component, OnInit } from '@angular/core';
    import {CounterService} from "../../counter.service"
    @Component({
      selector: 'c2',
      templateUrl: './c2.component.html',
      styleUrls: ['./c2.component.css'],
      providers:[CounterService]
    })
    export class C2Component implements OnInit {
    
      constructor(private s:CounterService) { }
    
      ngOnInit() {
      }
    
    }
    

    问题

    如何完成每个模块的服务?

    不适用于默认注射器。默认注入器将节点保持在根级别和组件级别,而不是功能模块级别。如果有真实场景,您将必须有一个自定义 Injector。

    【讨论】:

    • 您是否正在寻找每个功能模块都有实例的服务?或者具有导出服务的模块,您可以将其导入到不同的功能模块,但导出服务的实例会有不同?
    • 每个模块的实例
    【解决方案2】:

    编辑:我之前的回答并不完全正确。完成这项工作的正确方法是使用延迟加载的模块,在那里提供服务。给定的服务不应在某处提供静态 forRoot() 方法,因为这样延迟加载的模块将访问根注入器。

    没有这样做的实际参考,因为这不是 angular 的设计方式,但如果你想要这样,你必须相反

    https://angular.io/guide/singleton-services#providing-a-singleton-service

    https://angular.io/guide/singleton-services#forroot

    旧的不完全正确: 您只需在每个模块的提供者元数据中声明您希望成为每个模块的单个实例的服务。然后 Angular 将不会重用该服务的任何实例。

    给出场景:你有两个模块,ModuleA 和 ModuleB,都需要服务但不同的实例,然后你将在 ModuleA 和 ModuleB 的提供者部分声明它们。

    参考: https://angular.io/guide/singleton-services

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2021-08-29
    • 2020-06-04
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多