angular - 使用同一服务的多个实例

标签 angular angular2-services

我有这样的服务:

@Injectable()
export class EditorService { ... }

我有一个组件,像这样:

@Component({
  ...
  template: `<child-component></child-component>`,
  providers: [EditorService],
  ...
})
export class SomeComponent {
  constructor(
    private _appleEditorService: EditorService,
    private _pearEditorService: EditorService) {}
  }

您可能已经注意到,该组件有一个子组件:

@Component({
  ...
  selector: 'child-component',
  ...
})
export class ChildComponent {
  constructor(
    private _appleEditorService: EditorService,
    private _pearEditorService: EditorService) {}
  }

如您所见,我需要 EditorService 的两个实例:一个用于编辑苹果,一个用于编辑梨。然而,上面的代码是行不通的,因为 Angular 无法知道哪个 EditorService 实例是哪个实例,因为它们的变量名是私有(private)的。 ChildComponent 中的 _pearEditorService 可能指的是与 SomeComponent 中的 _appleEditorService 相同的实例。

问题:否则,我可以使用同一个 Angular2 服务两次吗?

编辑: 我的问题是是否可以使用相同的类。我知道有一些解决方法,可以为服务的每个实例实际创建一个单独的类,甚至可以通过继承用很少的代码来做到这一点。我只是想知道如果没有它是否可以完成。

最佳答案

Angular DI 为每个提供者维护一个实例。在您的情况下,如果您有两个具有相同类型的构造函数参数,它们将解析为相同的实例。

你可以做的是提供一个工厂函数(不同于简单的 useFactory 提供者事件,尽管它也使用它)

(示例复制自 https://stackoverflow.com/a/37517575/217408 )

{ provide: EditorService, useFactory: 
    (dep1, dep2) => {
        return (x) => { 
            new EditorService(x, dep1, dep2);
        }
    }, deps: [Dep1, Dep2]
})

....

constructor(@Inject(EditorService) editorServiceFactory: any) {
  let editorService1 = editorServiceFactory(1);
  let editorService2 = editorServiceFactory(2);
}

如果您有固定数量的实例,这应该可行:

{ provide: 'instance1', useClass: EditorService },
{ provide: 'instance2', useClass: EditorService },
export class SomeComponent {
    constructor(
        @Inject('instance1') private _appleEditorService: EditorService,
        @Inject('instance2') private _pearEditorService: EditorService) {}
}

关于angular - 使用同一服务的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482357/

相关文章:

Angular 2 和带有 html 5 视频的相机流的实例化

javascript - 在模板中包含包含 html 的变量 - angular2

Angular CLI 1.0.0-rc.0 和模块之间的路由

angular - 如果存在 linting 问题,是否可以中断 ng serve build?

angular - 如何在 Angular 2/4 的不同 Json 数组中使用相同的模型名称

Angular 2 单元测试 http.get 未定义

http - 如何避免 jsonp 请求超时错误?

angular - 如何在 Angular 2 中集成 JWplayer

angular - 如何修复 Angular 2 `Uncaught (in promise): TypeError: Cannot read property ' query' of null`?

javascript - .map回调函数参数未找到错误[Angular2,JavaScript]