我有一个表示模型的typescript类,我希望实例通过角度Http
服务与API通信。
但是模型的构造函数在创建实例时需要参数。例如,一些超级简单的东西:
class SomeModel{
constructor(public id:number, public name:string, ){
}
我想注入Http
服务,以便我的实例可以使用它,但似乎这样做的规范方法是使用以下命令来构造:
constructor(http:Http)
我一直在挖掘Injector
文档,但它有点稀疏,我找不到任何可行的东西。有没有办法在不使用构造函数模式的情况下从DI系统获取Http
之类的服务?
答案 0 :(得分:4)
我设法使用角度4解决了同样的问题。首先,您创建了使用组件注入器的新注入器。它知道您的SomeModel
类,并将modelParams
作为SomeModelParameters
类的实例传递。然后使用这个新创建的注入器来创建类实例。
@Injectable()
class SomeModel {
constructor(http: Http, someModelParamters: SomeModelParameters) { }
}
export class MyComponent {
constructor(injector: Injector) {
const modelParams = new SomeModelParameters();
const injectorWithModelParams = ReflectiveInjector.resolveAndCreate(
[
SomeModel,
{ provide: SomeModelParameters, useValue: modelParams }
],
injector);
this.someModel = injectorWithModelParams.resolveAndInstantiate([SomeModel]);
}
}
答案 1 :(得分:2)
<强>更新强>
HTTP_PROVIDERS
早已不复存在。
HttpClientModule
是目前的替代品。
<强>原始强>
如果您注入具有构造函数参数的类,则需要添加@Injectable
注释。
@Injectable()
class SomeModel{
// constructor(public id:number, public name:string, ){
// }
constructor(http:Http) {}
}
要实现此目的,HTTP_PROVIDERS
需要添加到bootstrap(AppComponent, [HTTP_PROVIDERS]);
另见Angular2 beta - bootstrapping HTTP_PROVIDERS - "Unexpected Token <"
如果你需要传递组件中的其他参数,你可以使用函数来传递它们。
另一种方法是手动创建实例并从注入器请求Http
。
export class MyComponent {
constructor(injector: Injector) {
this.someModel = new SomeModel(Injector.resolveAndCreate(Http), 1, 2);
}
}