当构造函数具有参数时,Angular 2 中的依赖注入

Dependency injection in Angular 2 when a constructor has arguments

本文关键字:依赖 注入 Angular 构造函数 参数      更新时间:2023-09-26

我有一个表示模型的打字稿类,我希望实例通过angular的Http服务与API进行通信。

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

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

我想注入 Http 服务,以便它可用于我的实例,但这似乎是这样做的规范方式,通过以下方式征用构造函数:

constructor(http:Http)

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

我设法使用角度 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]);
    }
}

更新

HTTP_PROVIDERS早已不复存在。 HttpClientModule是当前的替代品。

源语言

如果注入具有构造函数参数的类,则需要添加@Injectable注释。

@Injectable() 
class SomeModel{
   // constructor(public id:number, public name:string, ){
    // }
    constructor(http:Http) {} 
} 

为此,需要将HTTP_PROVIDERS添加到bootstrap(AppComponent, [HTTP_PROVIDERS]);

另请参阅Angular2测试版 - 引导HTTP_PROVIDERS - "意外令牌<"

如果需要从组件传递其他参数,则可以使用函数传递它们。

另一种方法是手动创建实例并从注入器请求Http

export class MyComponent {
  constructor(injector: Injector) {
    this.someModel = new SomeModel(Injector.resolveAndCreate(Http), 1, 2);
   } 
}