假设我有这个Angular 2服务:
@Injectable()
class Demo {
constructor(private instanceSpecificString: string) {
}
}
请注意,其构造函数接受特定于实例的字符串。我的意思是我想多次实例化这个服务,每次实例化时,我想根据服务实例化的上下文传递一个不同的字符串。
我该怎么做?
P.S。我以string
为例,但该参数可以很容易地为number
,boolean
,甚至某种配置object
。
答案 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();
}
}