web-dev-qa-db-ja.com

コンストラクターパラメーターを必要とするサービスを注入する

開始する値が必要なサービスがあります。

@Injectable()
export class MyService {
  private myVals: any;

  constructor(init : any) {
    this.myVals = init;
  }
}

そして消費者:

@Component(...)
export class MyComponent {
  private svc: MyService;
  constructor(private svc : MyService) {
  }
}

必要なパラメータをMyServiceconstructorに注入して、依存関係の注入中に渡す方法はありますか??

何かのようなもの:

constructor(private svc({ // init vales }) : MyService) {}

変数で渡すことができることは知っていますが、APIからこれを行う方法があるかどうかを調べることに興味があります。

23
gt6707a

Angularチームが here で推奨する公式の方法があります。基本的に、静的に型指定された構成クラスを注入できます。

私はそれをうまく実装しました、そして、ここにすべての関連するコードがあります:

1)app.config.ts

import { OpaqueToken } from "@angular/core";

export let APP_CONFIG = new OpaqueToken("app.config");

export interface IAppConfig {
    apiEndpoint: string;
}

export const AppConfig: IAppConfig = {    
    apiEndpoint: "http://localhost:15422/api/"    
};

2)app.module.ts

import { APP_CONFIG, AppConfig } from './app.config';

@NgModule({
    providers: [
        { provide: APP_CONFIG, useValue: AppConfig }
    ]
})

3)your.service.ts

import { APP_CONFIG, IAppConfig } from './app.config';

@Injectable()
export class YourService {

    constructor(@Inject(APP_CONFIG) private config: IAppConfig) {
             // You can use config.apiEndpoint now
    }   
}

これで、文字列名を使用せずに、静的チェックにインターフェイスを使用して、どこにでも設定を注入できます。

もちろん、インターフェースと定数をさらに分離して、生産と開発で異なる値を提供することができます。

16

上記の回答は、angular 4これで次のように使用できます。

import { NgModule, APP_INITIALIZER } from '@angular/core';

@NgModule({
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: onAppInit1,
      multi: true,
      deps: [/* your dependencies */]
    },
    {
      provide: APP_INITIALIZER,
      useFactory: onAppInit2,
      multi: true,
      deps: [/* your dependencies */]
    }
  ]
})
export class AppModule { }

詳細については 情報はこちらを参照

3
Black Mamba