首页 > 解决方案 > 使用动态配置设置来初始化 AngularFireModule

问题描述

获得 angularfire ( https://github.com/angular/angularfire ) 的第一次体验目前我正在尝试动态解析初始化的配置属性,以便在我们所有的环境中使用我们的应用程序的相同构建版本(开发,非生产, ...)。

为此,我正在使用环境预加载器...

import { environment } from './environments/environment';
import { environmentLoader } from './environments/environment-loader';
...

/**
 * Loads the environment available in the assets folder. This enables dynamic configuration for Docker images.
 */
export const environmentLoader = new Promise<any>((resolve, reject) => {
    const xmlhttp = new XMLHttpRequest();
    const url = './assets/environments/environment.json';
    xmlhttp.open('GET', url, true);
    xmlhttp.onload = () => {
        if (xmlhttp.status === 200) {
            resolve(JSON.parse(xmlhttp.responseText));
        } else {
            console.warn('Default env is used!');
            resolve(defaultEnvironment);
        }
    };
    xmlhttp.send();
});

...在我的 main.ts ...

...

environmentLoader.then((env) => {
  /**
   * Replaces the environment values with the assets environment.json data.
   */
  Object.assign(environment, env);

  ...

  platformBrowserDynamic()
    .bootstrapModule(AppModule)
    .catch((err) => console.error(err));
});

如您所见,预加载器确实将用于开发的本地 environment.ts 的内容与其他环境的特定变体进行了切换。使用这种技术,可以在应用程序中使用每个环境的相应设置,而无需重新构建。

除了在 app.module.ts 中初始化 AngularFireModule 之外,所有这些都非常顺利。为此,似乎必须在根模块的导入部分中初始化模块,如下所示......


...
import { environment } from 'src/environments/environment';
...

AngularFireModule.initializeApp(environment.firebase);
...

然而,在预加载器执行之后,引导是链接的,这个初始化似乎是异步执行的。结果,AngularFireModule 总是使用本地环境属性进行初始化,并且不考虑环境变化(使用 APP_INITIALIZER 令牌来延迟引导并等待环境预加载 - 就像我在类似情况下与某些提供商一起工作时所做的那样- 似乎也不是一个选择)。

问题:

感谢您的任何建议,亲切的问候

标签: angularfirebaseangularfire

解决方案


推荐阅读