2017-09-27 2 views
1

Je crée actuellement une bibliothèque angulaire personnalisée qui dépend de l'environnement des hôtes. Idéalement, je voudrais simplement passer quelques variables d'environnement dans la méthode forRoot de mon module pour un service à utiliser selon l'application qui l'utilise et l'environnement dans lequel elles se trouvent. Cependant, je reçois une erreur lors de la compilation avec angular-cli et juste en passant des variables de mon environment.ts en app.module.ts.Transfert de fichiers d'environnement dans un module Angular 2 personnalisé

ERREUR en erreur: Erreur rencontrée lors de la résolution statique des valeurs de symbole. Les appels de fonction ne sont pas pris en charge. Envisagez de remplacer la fonction ou lambda par une référence à une fonction exportée (position 19:24 dans le fichier .ts original), en résolvant l'environnement de symbole dans /Users/griffin/DCP/customer-dashboard/src/environments/environment.ts, en résolvant Symbole AppModule dans /Users/griffin/DCP/customer-dashboard/src/app/app.module.ts, résolution du symbole AppModule dans/Users/griffin/DCP/customer-

L'index du module personnalisé est actuellement configuré comme ceci :

@NgModule({ 
declarations: [], 
exports: [], 
providers: [ 
AuthService 
], 
imports: [ 
HttpModule, 
BrowserModule 
] 
}) 
export class CommonAuthModule { 
static forRoot(config: AuthServiceConfig): ModuleWithProviders { 
    return { 
    ngModule: CommonAuthModule, 
    providers: [ 
    {provide: AuthServiceConfig, useValue: config } 
    ] 
    }; 
} 

Et dans un projet angulaire j'importe comme ceci:

import { CommonAuthModule } from '@dcp/common-auth'; 
import { environment } from '../environments/environment'; 

@NgModule({ 
declarations: [ 
    AppComponent 
], 
imports: [ 
    CommonAuthModule.forRoot(environment.authConfig) // Import here 
    ... 
}) 
export class AppModule { } 

environment.authConfig est simple objet

authConfig: { 
    authenticationUrl: 'https://streamworks.auth0.com/login?client=', 
    clientId: 'f98h3f3fdsousfoihohfjwe0', 
    auth0Domain: 'streamworks.auth0.com' 
} 

Et AuthServiceConfig est une classe simple

export class AuthServiceConfig { 
    clientId: string = '' 
    auth0Domain: string = ''; 
    authenticationUrl: string = ''; 
} 

J'ai vu des problèmes similaires comme this poste. Est-ce lié à la compilation AoT? J'ai essayé de construire le projet en contournant AoT mais j'ai toujours la même erreur.

Répondre

0

Le problème est que lorsque vous spécifiez 'useValue', vous devez spécifier une valeur, et celle-ci doit être non injectée.

J'ai un code similaire qui fonctionne, mais j'utilise 'useFactory' à la place. Pour ce faire, vous devez fournir une méthode statique dans la classe de module qui fait office de fabrique (renvoie une instance de la chose fournie).

mine ressemble à ceci:

NgModule({ 
    declarations: [ 
    AppComponent 
    ], 
    imports: [ 
    BrowserModule, 
    AppRoutingModule, 
    etc.... 
    ], 
    providers: [ 
    { provide: COMMON_CONFIG, useFactory: AppModule.commonConfigFactory }, 

    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { 
    static commonConfigFactory() { 
    return new CommonConfig(environment); 
    } 
} 

Dans le code ci-dessus, COMMON_CONFIG est un InjectionToken et "CommonConfig" est une classe simple wrapper pour l'objet de l'environnement.

+1

Certainement sur la bonne voie. Mais comment puis-je fournir COMMON_CONFIG comme valeur pour "useValue" dans ma bibliothèque via la méthode forRoot? – gciluffo