Dev*_*aro 22 angular2-services angular
我有一个服务,像这样:
@Injectable()
export class EditorService { ... }
Run Code Online (Sandbox Code Playgroud)
我有一个组件,像这样:
@Component({
...
template: `<child-component></child-component>`,
providers: [EditorService],
...
})
export class SomeComponent {
constructor(
private _appleEditorService: EditorService,
private _pearEditorService: EditorService) {}
}
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到,此组件具有子组件:
@Component({
...
selector: 'child-component',
...
})
export class ChildComponent {
constructor(
private _appleEditorService: EditorService,
private _pearEditorService: EditorService) {}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我想要两个我的实例EditorService:一个用于编辑苹果,一个用于编辑梨.但是,上面的代码不起作用,因为Angular无法知道哪个实例的EditorService变量名是私有的._pearEditorService在ChildComponent还不如指同一个实例_appleEditorService中SomeComponent.
问题:那么,我可以两次使用相同的Angular2服务吗?
编辑:我的问题的关键是如果可以使用相同的类.我知道有一些解决方法是为服务的每个实例创建一个单独的类,甚至通过继承实现少量代码.我只是想知道是否可以不用.
Gün*_*uer 44
Angular DI为每个提供者维护一个实例.在您的情况下,如果您有两个具有相同类型的构造函数参数,则它们将解析为同一实例.
你可以做的是提供一个工厂功能(不同于一个简单的useFactory提供者事件,虽然它也使用它)
(从/sf/answers/2626230281/复制的示例)
{ 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);
}
Run Code Online (Sandbox Code Playgroud)
如果你有一个固定数量的实例,这应该工作:
{ provide: 'instance1', useClass: EditorService },
{ provide: 'instance2', useClass: EditorService },
Run Code Online (Sandbox Code Playgroud)
export class SomeComponent {
constructor(
@Inject('instance1') private _appleEditorService: EditorService,
@Inject('instance2') private _pearEditorService: EditorService) {}
}
Run Code Online (Sandbox Code Playgroud)