J'ai un service qui nécessite une certaine valeur pour être lancé:
@Injectable()
export class MyService {
private myVals: any;
constructor(init : any) {
this.myVals = init;
}
}
Et le consommateur:
@Component(...)
export class MyComponent {
private svc: MyService;
constructor(private svc : MyService) {
}
}
Existe-t-il un moyen d'injecter et de passer le paramètre requis à MyService
constructor
"pendant" l'injection de dépendance ??
Quelque chose comme:
constructor(private svc({ // init vales }) : MyService) {}
Je sais que je peux passer par variable, mais je souhaite savoir s'il existe un moyen de le faire à partir de l'API.
Il existe une manière officielle que Angular recommande dans ici . Elle vous permet essentiellement d'injecter des classes de configuration typées statiquement.
Je l'ai implémenté avec succès et voici tout le code pertinent:
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
}
}
Vous pouvez maintenant injecter la configuration partout sans utiliser les noms de chaîne et en utilisant votre interface pour les contrôles statiques.
Bien sûr, vous pouvez séparer l'interface et la constante pour pouvoir fournir différentes valeurs dans la production et le développement, par ex.
La réponse ci-dessus est déconseillée depuis angular 4
Vous pouvez maintenant l'utiliser comme ceci:
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 { }
pour plus info se référer ici