当构造函数具有参数

时间:2016-01-21 23:39:51

标签: javascript dependency-injection angular

我有一个表示模型的typescript类,我希望实例通过角度Http服务与API通信。

但是模型的构造函数在创建实例时需要参数。例如,一些超级简单的东西:

class SomeModel{
    constructor(public id:number, public name:string, ){
    }

我想注入Http服务,以便我的实例可以使用它,但似乎这样做的规范方法是使用以下命令来构造:

constructor(http:Http)

我一直在挖掘Injector文档,但它有点稀疏,我找不到任何可行的东西。有没有办法在不使用构造函数模式的情况下从DI系统获取Http之类的服务?

2 个答案:

答案 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);

   } 
}