passing environment variables to angular2 library

前端 未结 5 1839
Happy的楠姐
Happy的楠姐 2020-12-08 03:04

I\'ve created company internal library using angualr2-library yeoman generator.

Some of the angular services are using environment variables in our current applicati

5条回答
  •  失恋的感觉
    2020-12-08 03:29

    In case you still searching for a solution, here's how I accomplished something simliar to what you were asking for (using Angular 4.2.4).

    In your AppModule (or the place where you want to import your library), call the forRoot() method on your LibraryModule. With the help of this function, you can pass any config values to you library, e.g. your app's environment.

    import {environment} from "../environments/environment";
    ...
    
    @NgModule({
        declarations: [
            AppComponent
        ],
        imports: [
            BrowserModule,
            ...
            LibraryModule.forRoot(environment)
        ],
        bootstrap: [AppComponent]
    })
    export class AppModule {
    }
    

    You LibraryModule of course needs to offer the forRoot() method. In the providers array you then can provide services, values and more. In this case, 'env' acts as the token holding the given environment object for simplicity. You can also use an InjectionToken instead.

    @NgModule({
        ...
    })
    export class LibraryModule {
    
        public static forRoot(environment: any): ModuleWithProviders {
    
            return {
                ngModule: LibraryModule,
                providers: [
                    ImageService,
                    {
                        provide: 'env', // you can also use InjectionToken
                        useValue: environment
                    }
                ]
            };
        }
    }
    

    Since the token env is now provided by your LibraryModule, you can inject it in all of its child services or components.

    @Injectable()
    export class ImageService {
    
        constructor(private http: Http, @Inject('env') private env) {
        }
    
        load(): Observable {
            // assume apiUrl exists in you app's environment:
            return this.http.get(`${this.env.apiUrl}/images`)
                .map(res => res.json());
        }
    
    }
    

    I hope that helps!

提交回复
热议问题