使用Angular为每个模块声明一个新的服务实例?

时间:2018-02-20 08:33:07

标签: javascript angular

我正在使用棱角分明。我已经知道,当一个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

2 个答案:

答案 0 :(得分:0)

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

没有实际的参考,因为这不是角度的设计方式,但如果你想这样做,你必须与

相反

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

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

旧不完全正确: 您必须为每个模块的提供者元数据中的每个模块声明您想要成为单个实例的服务。然后Angular不会重用任何服务实例。

给予方案:您有两个模块,ModuleA和ModuleB,都需要服务但不同的实例,然后您将在ModuleA和ModuleB的providers部分中声明它们。

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

答案 1 :(得分:-1)

  

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

所以看起来没有办法在功能模块级别注入,因为除了根模块之外没有模块级注入器。

但是角度在注射器的每个组件级别都有节点,所以这种情况下我必须使用组合级别注射器。

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

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

另外,请检查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。默认的Injector将节点保持在根级别和组件级别,而不是在功能模块级别。如果有真实的情况,你必须有一个自定义的注射器。