Angular 5:有条件地将服务与组件隔离

时间:2017-12-19 16:32:32

标签: angular typescript

我有一个包含在根模块中的服务,因此该模块的每个组件都可以使用相同的服务实例。我有一个名为 ComponentX

的组件

模块

providers: [
    BiesbroeckHttpService
],

组件

constructor(private biesbroeckHttpService: BiesbroeckHttpService){}

但是,有时,根据此 ComponentX 中变量的值,必须隔离此相同的服务,因此它不会使用模块中包含的相同服务实例。这是必需的,因为有几个订阅需要并行运行。

经过几个小时的尝试,我仍然不知道如何做到这一点。

请帮助或指出我正确的方向。

2 个答案:

答案 0 :(得分:1)

这不是超级优雅,但可能是一种可能的解决方案。您可以创建一个扩展BiesbroeckHttpService

的额外服务类
@Injectable()
export class ExtraService extends BiesbroeckHttpService {}

然后在您的组件中使用ExtraService作为令牌,但使用BiesbroeckHttpService作为提供商定义。

@Component({
    providers: [
        {
            provide: ExtraService,
            useClass: BiesbroeckHttpService
        }
    ]
})
export class MyComponent {
    constructor(
        private componentService: ExtraService,
        private singletonService: BiesbroeckHttpService
    ){
        // component now has access to both a component instance & the singleton instance
    }
}

这是一个stackblitz演示。

有一点需要注意。如果MyComponent的子组件需要访问MyComponent的实例,则必须注入ExtraService而不是BiesbroeckHttpService

答案 1 :(得分:-1)

我只是为隔离案例提供另一项服务,并在实际组件上使用if语句来决定使用哪种服务。