gpt4 book ai didi

forRoot 方法中的 Angular 调用函数

转载 作者:太空狗 更新时间:2023-10-29 17:10:05 25 4
gpt4 key购买 nike

问题是我在 forRoot 方法中调用一个函数,如下所示:

app.module.ts

import {environment} from '../environments/environment';

...

@NgModule({
imports: [
BrowserModule,
MyModule.forRoot({
config: {
sentryURL: environment.SENTRY_URL <-- This, calls the function
}
}),
HttpClientModule,
...
]})

environemnt.ts

export function loadJSON(filePath) {
const json = loadTextFileAjaxSync(filePath, 'application/json');
return JSON.parse(json);
}

export function loadTextFileAjaxSync(filePath, mimeType) {
const xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', filePath, false);
if (mimeType != null) {
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType(mimeType);
}
}
xmlhttp.send();
if (xmlhttp.status === 200) {
return xmlhttp.responseText;
} else {
return null;
}
}

export const environment = loadJSON('/assets/config.json');

配置如下:

{
"production": "false",
"SENTRY_URL": "https://...@sentry.com/whatever/1"
}

当我用 aot 构建时,它说:

ERROR in src/app/app.module.ts(41,20): Error during template compile of 'AppModule' Function calls are not supported in decorators but 'loadJSON' was called in 'environment' 'environment' calls 'loadJSON'.

有什么想法吗??

:)

更新的解决方案:

我的最终解决方案是,在应用程序中,使用 Suren Srapyan 所说的函数 getter。在库中,forRoot 方法应该如下所示:

export const OPTIONS = new InjectionToken<string>('OPTIONS');

export interface MyModuleOptions {
config: {
sentryURLGetter: () => string | Promise<string>;
}
}

export function initialize(options: any) {
console.log('sentryURL', options.config.sentryURLGetter());
return function () {
};
}

@NgModule({
imports: [
CommonModule
]
})
export class MyModule {
static forRoot(options: MyModuleOptions): ModuleWithProviders {
return {
ngModule: MyModule,
providers: [
{provide: OPTIONS, useValue: options},
{
provide: APP_INITIALIZER,
useFactory: initialize,
deps: [OPTIONS],
multi: true
}
]
};
}
}

:D

最佳答案

@Decorators 不支持函数调用。或者,您可以在 @NgModule 之外获取值,而不是使用它的值。

export function getSentryUrl() {
return environment.SENTRY_URL;
}

@NgModule({
imports: [
BrowserModule,
MyModule.forRoot({
config: {
getSentryURL: getSentryUrl
}
}),
HttpClientModule,
...
]})

关于forRoot 方法中的 Angular 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48225993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com