1

J'essaie d'obtenir mon application Angular CLI (1.0.0-rc.1) pour la production et l'obtention d'une erreur AOT. J'ai en fait 2 applications: une application principale et une application npm installée pour certains widgets d'interface utilisateur. L'application widgets UI nécessite certaines données de configuration (chemins, clés, etc.).ERROR in Error a rencontré une résolution statique des valeurs de symbole. Les appels de fonction d'appel ne sont pas pris en charge

Voici mon code dans mon application principale qui assemble les données de configuration et il passe au module interface 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: 
      [] 
     }; 
    } 
} 

et voici le 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) 
       } 
      ] 
     }; 
    } 
} 

Mon UIWidgetModule utilise un service (ClientConfigService) pour contenir les données de configuration du client. Les composants suivants utilisent diverses fonctions de ClientConfigService pour consommer les données de configuration. Le kicker est ClientConfigService est statique.

est ici 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; 
    }; 
} 

Le processus de construction pour la production (AOT) échoue lamentablement en essayant de définir la valeur de configuration pour la variable statique de ClientConfigService. Comment puis-je consommer les données de configuration dans mon module de widget? J'adore avoir un service statique pour fournir les données, donc je n'ai pas besoin de déposer ClientConfigService dans le constructeur de chaque composant qui en a besoin.

Merci.

+0

Pourquoi les commentaires ont-ils été supprimés? –

+0

@ Günter Zöchbauer - Qu'est-il arrivé à notre conversation? –

Répondre

0

Comment la conversation avec Günter Zöchbauer a été supprimée. Je ne sais pas pourquoi ou qui l'a supprimé.

Voici la suggestion de code faite par 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 
       } 
      ] 
     }; 
    } 
} 

Le problème est comment puis-je obtenir le paramètre de configuration passé dans forRoot à configHelperFactory je peux remplir ClientConfigService.ConfigModel?

Günter a suggéré de faire 'export const config: ConfigModel'. Faire const config ne fonctionne pas parce que c'est un const et doit être initialisé avec une valeur et une fois qu'un const est initialisé, il ne peut pas être modifié. Par conséquent, comment remplir ClientConfigService.ConfigModel avec la valeur transmise à forRoot?