我已经使用angualr2-library yeoman生成器创建了公司内部库.

一些angular服务在我们当前的应用程序中使用环境变量(每个env上的api端点都会更改).我想知道将当前环境对象传递给angular2图书馆服务的最佳方式是什么?

推荐答案

如果你还在寻找解决方案,下面是我如何完成一些与你要求的类似的事情(使用Angular 4.2.4).

在您的AppModule中(或您想要导入库的位置),调用您的LibraryModule上的forRoot()方法.在此函数的帮助下,您可以将任何配置值传递给您的库,例如您的应用程序的环境.

import {environment} from "../environments/environment";
...

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        ...
        LibraryModule.forRoot(environment)
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

当然,您LibraryModule需要提供forRoot()方法. 在提供者数组中,您可以提供服务,值为and more.在这种情况下,为简单起见,'env'充当保存给定环境对象的令牌.您也可以改用InjectionToken.

@NgModule({
    ...
})
export class LibraryModule {

    public static forRoot(environment: any): ModuleWithProviders {

        return {
            ngModule: LibraryModule,
            providers: [
                ImageService,
                {
                    provide: 'env', // you can also use InjectionToken
                    useValue: environment
                }
            ]
        };
    }
}

由于令牌env现在由您的LibraryModule提供,您可以将其注入到它的所有子服务或组件中.

@Injectable()
export class ImageService {

    constructor(private http: Http, @Inject('env') private env) {
    }

    load(): Observable<any> {
        // assume apiUrl exists in you app's environment:
        return this.http.get(`${this.env.apiUrl}/images`)
            .map(res => res.json());
    }

}

我希望这有帮助!

Angular相关问答推荐

Angular - Bootstrap 5 Carbon不工作

在状态更新后是否会再次触发ngrx效果?

尽管有模拟间谍实现,规范文件仍调用真正的服务

如何将管道异步化添加到不在html模板中的观察对象的Angular ?

如何将Angular 服务包含在延迟加载的独立组件路由中?

Angular 应用程序未在Azure应用程序服务中运行

找不到模块webpack dev服务器

无法创建新的 Ionic 项目

使用forkJoin和mergeMap的正确方式是什么?

在 kubernetes 上创建 Ingress 服务以将 springboot [后端] 连接到前端 [angular]

Angular 获取视频持续时间并存储在外部变量中

res.json() 不是函数

类型错误:无法读取未定义的属性

如何使用Angular4通过元素ID设置焦点

Angular 2 通过 [class.className] 绑定添加多个类

在 Angular 中动态设置样式

Angular 2 Material Design 组件是否支持布局指令?

如何防止角material垫菜单关闭?

为什么 ngOnInit 被调用两次?

Angular ngClass 和单击事件以切换类