Внедрить сервис, требующий параметр конструктора

У меня есть служба, для которой требуется определенное значение:

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

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

И потребитель:

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

Так есть ли способ ввести и передать требуемый параметр MyService constructor "во время" внедрения зависимости?

Что-то вроде:

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

Я знаю, что могу передавать по переменным, но мне интересно узнать, есть ли способ сделать это из API.

Ответ 1

Существует официальный способ, которым команда Angular рекомендует в здесь. Это в основном позволяет вводить статически типизированные классы конфигурации.

Я успешно его реализовал, и вот весь соответствующий код:

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
    }   
}

Теперь вы можете вставлять конфиг везде без использования имен строк и с использованием интерфейса для статических проверок.

Конечно, вы можете разделить интерфейс и константу, чтобы иметь возможность поставлять различные значения в процессе производства и разработки, например.

Ответ 2

Приведенный выше ответ устарел с 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

см. мой код, вы можете вводить параметры в сервисы, подобные этому

//our root app component
import {Component, NgModule, Injectable} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'


@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
    </div>
  `,
})
export class App {
  name:string;
  private myService;
  constructor() {
    this.myService = new MyService('value');
    this.name = 'Angular2'
  }
}



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

  constructor(init: any) {
    this.myInit = init;
    console.log('init', this.myInit);
  }
}




@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}