如何在服务中使用提供程序?

时间:2016-03-02 19:44:29

标签: angular

我需要使用一个服务的多个实例。

通常当我在组件中使用此服务的一个实例时,我这样写:

@Component({
    selector: 'one-component',
    providers: [provide("token1", {useClass: Service})],
    template: `
        <h1>App</h1>
    `
})
export class OneComponent {
    constructor(@Inject('token1') service:Service) {}
}

但是现在我需要在Service2中使用这个服务,我这样写:

export class Service2 {
    constructor(@Inject('token1') service:Service) {}
}

如您所知,它显示:

  

没有提供者

因为Service2没有providers: [provide("token1", {useClass: Service})]。但是我可以在哪里添加它,因为它没有@Component

由于

3 个答案:

答案 0 :(得分:3)

目前不支持以这种方式配置服务,目前还没有计划添加支持https://github.com/angular/angular/issues/5622

答案 1 :(得分:0)

我认为Gunter的答案在这里并不完全正确。 如果我正确理解了洪波苗的问题,这可以“轻松”实现。 如果您想在每次注入时获得服务的新实例,则必须使用useFactory而不是useClass提供程序配置。

然后,如果"token1" Service2中的OneComponent没有提供商错误,那是因为它没有配置在Service2的正确注入器,同级或父级...其中{{1}注入。

修改

要使其工作,您必须在根组件(例如)中定义ServiceService2提供程序。在这种情况下,所有人都将共享相同的服务实例。

如果要在每个组件中包含不同的实例,请在组件级别定义提供程序,这些提供程序正在使用服务。

@Component({
  providers: [Service, Service2],
  // Other config props
})
export class RootComponent {
}

@Component({
  // Config props
})
export class OneComponent {
  constructor(public service: Service) {}
  methodx() {
    this.service...
  }
}

@Component({
  // Config props
})
export class TwoComponent {
  constructor(public service: Service2) {}
  methodx() {
    this.service...
  }
}

@Injectable()
export class Service2 {
  constructor(public service: Service) {
  }
}

使用@Inject('StringToken')不是你做的最好的事情,也不是推荐的方法。请改用类型标记(如上面的代码所示)。

资源:

答案 2 :(得分:0)

我已通过声明app.module.ts的提供商数组中的两项服务来纠正此错误(将服务B用于服务A)。

@NgModule({
    declarations: [...],
    imports:      [...],
    providers:    [
        ServiceA,
        ServiceB,
    ],
    bootstrap:    [...],
})