角度2传递参数到服务构造函数

时间:2016-05-23 23:37:09

标签: angular

假设我有这个Angular 2服务:

@Injectable()
class Demo {
    constructor(private instanceSpecificString: string) {
    }
}

请注意,其构造函数接受特定于实例的字符串。我的意思是我想多次实例化这个服务,每次实例化时,我想根据服务实例化的上下文传递一个不同的字符串。

我该怎么做?

P.S。我以string为例,但该参数可以很容易地为numberboolean,甚至某种配置object

2 个答案:

答案 0 :(得分:3)

传递给您的服务的值将由实例化它的注入器确定。您可能能够在您的某个组件定义中执行此操作:

@Component({
    ...
    providers: [
        provide(string, {useValue: "someSpecificValue"})
    ]
})

但是,这有一个问题,就是您要为字符串令牌定义提供程序,这可能会导致可维护性问题。

为您的服务定义一些配置模型可能是更好的模式:

class DemoConfig {
    instanceSpecificString: string;
}

然后你可以创建一个实例来传递给你的服务。

let config = { instanceSpecificString: "someSpecificValue" }

@Component({
    ...
    providers: [
        provide(DemoConfig, {useExisting: config})
    ]
})

希望这有帮助。我自己没试过;我在申请中使用的服务是单身人士。这是我正在使用的参考:

https://angular.io/docs/ts/latest/api/core/index/provide-function.html

答案 1 :(得分:0)

由于该服务被声明为可注入(@Injectable()批注),因此它是单例的。因此,只需从服务顶部删除注释即可删除该限制。

这不一定是最佳做法,但可以在启用AOT的情况下运行和编译。

示例:

更改此服务:

@Injectable()
export class BaseSocket extends Socket {   
  protected constructor(
    private baseConfig:SocketIoConfig
    ...   
  ) {
    super();   
  } 
}

对此:

export class BaseSocket extends Socket {
  protected constructor(
    private baseConfig:SocketIoConfig
    ...
  ) {
     super();
  }
}