在 angular-cli 中使用我的模块:静态解析符号值时遇到错误

Using my module in angular-cli: Error encountered resolving symbol values statically

我知道我不是唯一对这个词有疑问的人。但是 angular 伙计们对这个术语有大约 23 个问题。我尝试了很多不同的东西。一个很重要:我尝试了他们为 @angular/http 做的相同方式(导出裸工厂功能)。

事实是:它有效 - 代码没有错误。但是当我尝试导入模块时出现此错误:

ERROR in Error encountered resolving symbol values statically. Calling function 
'TranslatorConfig', function calls are not supported. Consider replacing the 
function or lambda with a reference to an exported function, resolving symbol 
TranslatorModule.forRoot

当我 运行 ng serve and touch the file after this error 它重新编译没有错误。但是无论我尝试构建 (ng build -e prod --aot false) 什么,我都会收到此错误并且构建停止。当我在 tsconfig.json 中设置 "strictMetadataEmit": true 时,我也会收到此错误。我有一个 TranslatorModule.metadata.json - 这不会是错误。

为什么不起作用?此错误消息的详细含义是什么?什么是符号值,为什么它必须是静态的?如何让它发挥作用?

为了测试,您只需安装 angular2-translator@2.0.0-alpha3。您可以在 github 上找到代码:https://github.com/tflori/angular2-translator/tree/2.0

我刚刚尝试使用这些导出函数和不同的提供程序,如下所示。

export function createTranslatorConfig(config: any = {}) {
    return new TranslatorConfig(config);
}

export function createTranslator(translatorContainer: TranslatorContainer, module: string) {
    return translatorContainer.getTranslator(module);
}

// ...
export class TranslatorModule {
    public static forRoot(config: any = {}, module: string = "default"): ModuleWithProviders {
        return {
            ngModule: TranslatorModule,
            providers: [
                { provide: "TranslatorConfigOptions", useValue: config },
                { provide: TranslatorConfig, useFactory: createTranslatorConfig, deps: [ "TranslatorConfigOptions" ] },
                { provide: "TranslatorModuleName", useValue: module },
                {
                    provide: Translator,
                    useFactory: createTranslator,
                    deps: [ TranslatorContainer, "TranslatorModuleName" ],
                },
            ],
        };
    }
}

结果只是另一条错误消息(现在 'emakeDecorator' 符号 NgModule 有问题:ERROR in Error encountered resolving symbol values statically. Calling function 'ɵmakeDecorator', function calls are not supported. Consider replacing the function or lambda with a reference to an exported function, resolving symbol NgModule

我只有最后一个问题的答案。我仍然不知道 "symbol value" 是什么意思,消息仍然让我感到困惑。

最后 useValue 只能是一个值 - 你不能在这里或之前调用函数并给出结果。需要信息的工厂需要来自其他供应商的信息。

Babar 的 link 帮助我得出了这个有效的结论:

export const TRANSLATOR_GUARD: InjectionToken<string> = new InjectionToken("TRANSLATOR_GUARD");
export const TRANSLATOR_OPTIONS: InjectionToken<object> = new InjectionToken("TRANSLATOR_OPTIONS");
export const TRANSLATOR_MODULE: InjectionToken<string> = new InjectionToken("TRANSLATOR_MODULE");

@NgModule({
    declarations: [
        TranslatePipe,
        TranslateComponent,
    ],
    exports: [
        TranslatePipe,
        TranslateComponent,
    ],
    imports: [HttpModule],
    providers: [
        TranslationLoaderJson,
        TranslateLogHandler,
        TranslatorContainer,
    ],
})
export class TranslatorModule {
    public static forRoot(options: any = {}, module: string = "default"): ModuleWithProviders {
        return {
            ngModule: TranslatorModule,
            providers: [
                {
                    provide: TRANSLATOR_GUARD,
                    useFactory: guardTranslatorModule,
                    deps: [ [TranslatorConfig, new Optional(), new SkipSelf()]],
                },
                { provide: TRANSLATOR_OPTIONS, useValue: options },
                { provide: TranslatorConfig, useFactory: createTranslatorConfig, deps: [ TRANSLATOR_OPTIONS ] },
                { provide: TRANSLATOR_MODULE, useValue: module },
                {
                    provide: Translator,
                    useFactory: createTranslator,
                    deps: [ TranslatorContainer, TRANSLATOR_MODULE ],
                },
            ],
        };
    }

    public static forChild(module: string = "default") {
        return {
            ngModule: TranslatorModule,
            providers: [
                { provide: TRANSLATOR_MODULE, useValue: module },
                {
                    provide: Translator,
                    useFactory: createTranslator,
                    deps: [ TranslatorContainer, TRANSLATOR_MODULE ],
                },
            ],
        };
    }

    constructor(@Optional() @Inject(TRANSLATOR_GUARD) guard: any) {}
}

export function guardTranslatorModule(options: any): string {
    if (options) {
        throw new Error(
            "Application called TranslatorModule.forRoot twice. For submodules use TranslatorModule.forChild instead.",
        );
    }

    return "guarded";
}

export function createTranslatorConfig(config: any = {}) {
    return new TranslatorConfig(config);
}

export function createTranslator(translatorContainer: TranslatorContainer, module: string) {
    return translatorContainer.getTranslator(module);
}

我在问题中发布的内容也有效。我收到这个错误是因为 link 将模块 node_modules 测试项目。

我仍在寻找这个问题的答案:他们想从我这里得到什么?为什么?