1

我知道我不是唯一一个对这个词有疑问的人。但是有角度的家伙对这个术语有大约 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 并触摸文件时,它会重新编译而不会出现错误。但是无论我尝试构建什么(ng build -e prod --aot false),我都会收到此错误并且构建停止。当我"strictMetadataEmit": true在 tsconfig.json 中设置时,我也会收到此错误。我有一个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" ],
                },
            ],
        };
    }
}

结果只是另一个错误消息(现在符号 NgModule 的“emakeDecorator”有问题: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

4

1 回答 1

0

我只有最后一个问题的答案。我仍然不知道它们对“符号值”的含义,并且该消息仍然使我感到困惑。

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

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

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);
}

我在问题中发布的内容也有效。由于将模块链接到测试项目的 node_modules ,我得到了这个错误。

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

于 2017-04-10T04:33:23.270 回答