2017-04-09 39 views
1

我知道我不是唯一有關於這個術語的問題。但這個角色傢伙大約有23個關於這個詞的問題。我嘗試了很多不同的東西。其中一個很重要:我以與@angular/http(導出裸機功能)相同的方式嘗試。在angular-cli中使用我的模塊:遇到的錯誤靜態解析符號值

事實是:它的工作原理 - 代碼沒有錯誤。但是,當我嘗試導入模塊我得到這個錯誤:

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發球和這個錯誤將其重新編譯沒有錯誤之後觸摸文件。但是,我試圖建立(ng build -e prod --aot false)我得到這個錯誤,並停止構建。當我在tsconfig.json中設置"strictMetadataEmit": true時,我也會遇到這個錯誤。我有一個TranslatorModule.metadata.json - 這不會是錯誤。

爲什麼它不起作用?這個錯誤信息意味着什麼?什麼是符號值以及爲什麼它必須是靜態的?如何讓它工作?

對於測試,您可以只安裝[email protected]。你可以找到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

+0

'{提供:TranslatorConfig,useValue:new TranslatorConfig(config)},'不要在這裏實例化將其移到一個函數中,只需使用'useValue'或useFactory'調用函數 –

+0

?爲什麼?最後但並非最不重要的:我敢肯定它不會工作..我真的嘗試了很多。 – iRaS

+0

消息有一些不同 - 但是正如預期的那樣,它並沒有幫助:'遇到錯誤時遇到靜態解析符號值。調用函數'TranslatorConfig',不支持函數調用。考慮使用對導出函數的引用替換函數或lambda,解析符號createTranslatorConfig' – iRaS

回答

0

我只有一個回答最後一個問題我仍然不知道他們是什麼意思用「符號值」表示消息仍然讓我感到困惑

最後useValue只能是一個值 - 你不能在這裏或之前調用一個函數並給出結果,而需要信息的工廠需要它們另一家提供商

從巴貝爾鏈接幫助我得出這樣的結論的作品:

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,我得到了此錯誤。

我仍然在尋找一個問題的答案:他們想從我那裏得到什麼?爲什麼?

相關問題