Внедрить сервис, требующий параметр конструктора
У меня есть служба, для которой требуется определенное значение:
@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 {}