2017-12-18 8 views
0

Ich habe Node-Modul von Angular 5-Anwendung erstellt und ich habe Angular 5-Anwendung, die dieses Node-Modul verwenden müssen. Gibt es eine Möglichkeit, die Anwendungsumgebungsvariable Angular 5 (environments/environment.ts) von meinem Knotenmodul zu lesen? Vielleicht exportiert Angular 5 seine Umgebungsvariablen nach dem Build in globale JavaScript-Variablen und mein Node-Modul kann es von JavaScript bekommen?Wie erhalten Sie die Angular 5-Anwendungsumgebung vom NPM-Paket?

würde ich für jede Hilfe direkt

Antwort

0

So löste ich mein Problem.

ich erstellt abstrakte Klasse in meinem Knotenmodul

import { Injectable } from '@angular/core'; 

@Injectable() 
export abstract class ConfigService { 
    constructor() { } 
    public abstract getAppConfigProperties(): any; 
    public abstract getAppEnvironmentProperties(): any; 
} 

und eine andere Klasse in meiner Haupt-Anwendung, die diese eine erweiterte

import { Injectable } from '@angular/core'; 
import { ConfigService } from 'my_node_module'; 
import {environment} from '../../environments/environment'; 
import {appConfig} from '../app.config'; 

@Injectable() 
export class AppConfigService extends ConfigService { 
    public getAppConfigProperties(): any { 
     return appConfig; 
    } 
    public getAppEnvironmentProperties(): any { 
     return environment; 
    } 

} 

getAppConfigProperties und getAppEnvironmentProperties Methoden geben alle Variablen, die ich in meinem Knoten benötigen Modul. Und am Ende habe ich diese Zeile zu meinem Hauptanwendungsmodul hinzugefügt.

providers: [ 
    AppConfigService, 
    { provide: ConfigService, useExisting: AppConfigService }, 
... 

jetzt kann ich ConfigService Funktionen in meinem Knotenmodul verwendet Informationen, die ich von der Haupt App benötigen.

@Injectable() 
export class CoreService { 
    constructor(private configService: ConfigService) { } 

    public getWhatIneed(): void { 
     console.log(this.configService.getAppConfigProperties()); 
    } 
3

Der Knotenmodul sollte nicht von der Umgebungsdatei lesen dankbar. Es gibt keine Garantie, in welcher Dateistruktur sich die Umgebungsdateien des Benutzers befinden oder ob sie sogar Umgebungsdateien enthalten. Daher sollte das node_module völlig unabhängig von den Umgebungsbedingungen sein und stattdessen sollten Sie eine Variable übergeben, wenn Sie das Modul importieren. Dies gibt der Anwendung (und ihren Umgebungsdateien) volle Kontrolle darüber, was das Knotenmodul verwendet.

// app.module.ts 
import { environment } from './environments/environment'; 


@NgModule({ 
    imports: [MyNodeModule.setup(environment.myVar)] 
}) 
export class AppModule {} 

Dadurch kann der Benutzer entweder einen statischen Wert oder einen dynamischen Wert aus seinen eigenen Umgebungsdateien übergeben.


aktualisieren

Um die Verfügung, um Ihre node_module in Wert übergeben machen Sie einen InjectionToken

export const MY_TOKEN = new InjectionToken<string>('My passed in token'); 

verwenden können, um in MyModule Sie bieten dieses Token und den Wert zuweisen, war übergeben.

@NgModule() 
export class MyNodeModule { 
    static setup(myToken: string) { 
     return { 
      ngModule: MyNodeModule, 
      providers: [{ provide: MY_TOKEN, useValue: myToken }] 
     } 
    } 
} 

Jetzt für den Rest Ihres node_module, um das Token zu verwenden, können Sie es injizieren.

@Injectable() 
export class SomeService { 
    constructor(@Inject(MY_TOKEN) private myToken){} 
} 

Dies ist ein sehr einfaches stackblitz diese Funktionalität Demonstrieren.

+0

Ich würde die Variable in der Module nicht importieren, sondern einen Config Service, wie diese erstellen https://stackoverflow.com/questions/43193049/app-settings-the-angular-4-way/43193574#43193574 – masterfloda

+0

Danke @LLai für Ihre Antwort. Es klingt gut für mich. Ich habe nie Setup verwendet. Können Sie bitte ein Beispiel geben, wie MyModule diese Variable bekommen kann? –

+0

@MherAghabalyan Ich habe meine Antwort aktualisiert.Ich bin nicht sicher, wie Sie die Umgebungsvariable verwenden müssen, sondern die bereitgestellten Stackblitz-Demos, wie Sie einen Wert an 'MyNodeModule' übergeben können – LLai

Verwandte Themen