Angular 库 - 使用 APP_INITIALIZER 将参数传递给服务
Angular Library - Pass parameter to service with APP_INITIALIZER
我目前正在创建一个 angular 库 (angular 7)。我需要将一些配置传递给模块,我还需要调用函数“loadConfig”。问题是我无法在 loadConfig 函数中注入配置值。
如果我尝试将它添加到 deps 数组并向该函数添加一个参数,我将收到 nullinjector 错误。
我尝试添加一些控制台日志,在 forRoot 方法中,我得到了配置的值,在 SomeService 中,我也得到了正确的配置值。在 loadConfig 中,我总是将配置设置为未定义。使用控制台日志,我发现 forRoot 方法在 loadConfig 之前执行,所以我很困惑为什么它不起作用。
你能帮帮我吗?
export function loadConfig() {
//some code
//if I add config as a parameter, the config here is undefined
}
export class SomeModule {
public static forRoot(config: any): ModuleWithProviders {
//if I console log here config is populated
return {
ngModule: SomeModule,
providers: [
SomeService,
{
provide: "config",
useValue: config,
},
{
provide: APP_INITIALIZER,
useFactory: loadConfig,
deps: [], //tried adding config here but get nullinjector error
multi: true,
}
],
};
}
}
export class SomeService {
constructor(@Inject("config") private config: any) {
//the config here is populated
}
}
我在你的代码中没有发现任何主要问题,它运行良好。
我建议你使用 InjectionToken
存储在全局变量中。
这段代码对我来说就像一个魅力:
export const CONFIG_TOKEN = new InjectionToken('APP_CONFIG');
export function initConfig(config: any) {
return () => {...}
}
export class SomeModule {
public static forRoot(config: any): ModuleWithProviders {
return {
ngModule: SomeModule,
providers: [
{
provide: CONFIG_TOKEN,
useValue: config,
},
{
provide: APP_INITIALIZER,
useFactory: initConfig,
deps: [CONFIG_TOKEN],
multi: true,
}
]
};
}
}
我目前正在创建一个 angular 库 (angular 7)。我需要将一些配置传递给模块,我还需要调用函数“loadConfig”。问题是我无法在 loadConfig 函数中注入配置值。
如果我尝试将它添加到 deps 数组并向该函数添加一个参数,我将收到 nullinjector 错误。
我尝试添加一些控制台日志,在 forRoot 方法中,我得到了配置的值,在 SomeService 中,我也得到了正确的配置值。在 loadConfig 中,我总是将配置设置为未定义。使用控制台日志,我发现 forRoot 方法在 loadConfig 之前执行,所以我很困惑为什么它不起作用。
你能帮帮我吗?
export function loadConfig() {
//some code
//if I add config as a parameter, the config here is undefined
}
export class SomeModule {
public static forRoot(config: any): ModuleWithProviders {
//if I console log here config is populated
return {
ngModule: SomeModule,
providers: [
SomeService,
{
provide: "config",
useValue: config,
},
{
provide: APP_INITIALIZER,
useFactory: loadConfig,
deps: [], //tried adding config here but get nullinjector error
multi: true,
}
],
};
}
}
export class SomeService {
constructor(@Inject("config") private config: any) {
//the config here is populated
}
}
我在你的代码中没有发现任何主要问题,它运行良好。
我建议你使用 InjectionToken
存储在全局变量中。
这段代码对我来说就像一个魅力:
export const CONFIG_TOKEN = new InjectionToken('APP_CONFIG');
export function initConfig(config: any) {
return () => {...}
}
export class SomeModule {
public static forRoot(config: any): ModuleWithProviders {
return {
ngModule: SomeModule,
providers: [
{
provide: CONFIG_TOKEN,
useValue: config,
},
{
provide: APP_INITIALIZER,
useFactory: initConfig,
deps: [CONFIG_TOKEN],
multi: true,
}
]
};
}
}