ERROR in Error遇到静态解析符号值。不支持调用函数调用

时间:2017-03-08 08:07:50

标签: angular angular-cli angular2-aot angular-module angular2-bootstrapping

我正在尝试使用我的Angular CLI(1.0.0-rc.1)应用程序来构建产品并收到AOT错误。我实际上有2个应用程序:主应用程序和一些用于某些UI小部件的npm安装应用程序。 UI小部件应用程序需要一些配置数据(路径,密钥等)。

这是我的主要应用程序中的代码,它汇编了配置数据并将其传递给UI Widget模块:

export const config: ConfigData = 
{
    UrlRoot: 'XXXX',
    Key: 'ZZZZ'
}   

@NgModule({
    imports:
    [
        UiWidgetModule.forRoot(config)      
    ],
    declarations:
    [],
    exports:
    []
})
export class CoreModule
{
    static forRoot(): ModuleWithProviders
    {
        return {
            ngModule: CoreModule,
            providers:
            []
        };
    }
}

这是UIWidgetModule:

export function configHelperFactory(config: ConfigData) 
{
    ClientConfigService.ConfigModel = config;
    return ClientConfigService;
}

@NgModule({
    imports:
    [
        CommonModule
    ],
    declarations:
    [
        //COMPONENTS
    ],
    exports:
    [
        //COMPONENTS
    ],
    entryComponents:
    [
        //COMPONENTS
    ],
    providers:
    [
    ]
})
export class UiWidgetModule
{
    static forRoot(config: ConfigData): ModuleWithProviders
    {   
        return {
            ngModule: UiWidgetModule,
            providers:
            [
                ClientConfigService,
                {
                    provide: ClientConfigService,
                    useFactory: configHelperFactory(config)
                }
            ]
        };
    }   
}

我的UIWidgetModule使用服务(ClientConfigService)来保存来自客户端的配置数据。后续组件使用ClientConfigService中的各种函数来使用配置数据。踢球者是ClientConfigService是静态的。

这是ClientConfigService:

import { ConfigData }   from "../models/index";

export class ClientConfigService 
{
    static ConfigModel: ConfigData ;

    static BuildMediaUrl(nodeId: string) : string
    { 
        return ClientConfigService.ConfigModel.UrlRoot+ '/' + nodeId;
    };      

    static GetKey(): string
    {
        return ClientConfigService.ConfigModel.Key;
    };
}

生产构建过程(AOT)失败了,试图为ClientConfigService的静态变量设置配置值。如何在窗口小部件模块中使用配置数据?我喜欢静态服务提供数据,因此我不必将ClientConfigService放在需要它的每个组件的构造函数中。

感谢。

1 个答案:

答案 0 :(得分:0)

与GünterZöchbauer的谈话被删除了。我不确定为什么或谁删除它。

这是Günter提出的代码建议:

export const config: ConfigModel = new ConfigModel();
export function configHelperFactory() 
{
    console.log('CONFIG:', config);
    ClientConfigService.ConfigModel = config;
}

@NgModule({
    imports:
    [
        CommonModule
    ],
    declarations:
    [
        //COMPONENTS
    ],
    exports:
    [
        //COMPONENTS
    ],
    entryComponents:
    [
        //COMPONENTS
    ],
    providers:
    [
    ]
})
export class UiWidgetModule
{
    static forRoot(config: ConfigModel): ModuleWithProviders
    {   
        return {
            ngModule: UiWidgetModule,
            providers:
            [
                ClientConfigService,
                {
                    provide: ClientConfigService,
                    useFactory: configHelperFactory
                }
            ]
        };
    }   
}

问题是我如何将配置参数传递给forRoot到configHelperFactory所以我可以填充ClientConfigService.ConfigModel?

Günter建议制作'export const config:ConfigModel'。使const配置不起作用,因为它是一个const,必须用值初始化,一旦const初始化,就不能修改它。

那么,如何使用传递给forRoot的值填充ClientConfigService.ConfigModel?