1

我目前正在创建一个角度应用程序,该应用程序使用 aREST API来发送和接收来自后端实例的调用。目前,此 URL 被定义为环境变量,如下所示:

export const environment = {
  production: false,
  loggerLevel: NgxLoggerLevel.DEBUG,
  disableConsoleLogging: false,
  lang: 'en',
  api: {
    . //other variables
    .
    .
    host: "http://mycoolurl.com/rest/v11_1/",
    . 
    . //more variables
    .
  }
};

现在,有一个类似的问题在这里解决了这个问题,但即使它使用了一个特定的 settings.json 文件,该文件也可以使用APP INITIALIZER. 此处的另一个类似问题也建议我使用单独的 JSON 文件。

最近的一项要求更改表明,用户应该能够指定他想要将REST调用发送到的 URL,因此最好将其作为输入字段,他将在其中输入 URL,并且它将更新环境文件中的主机. 我如何实现这一目标?

不幸的是,我无法更改整个实现并将主机从环境中删除,它在整个应用程序的许多地方都被导入和使用。

4

1 回答 1

1

您不能真正直接在代码中更改环境的值,因为它与其他所有内容捆绑在一起。这也是一种非常糟糕的方法,因为每次更新应用程序时都会覆盖该值。将其单独存储在服务器端!

选项 A:

加载后,使用 APP_INITIALIZER 并覆盖那里的环境值: environment.api.host = loadedValue

仅当您在此之前不使用该值时,它才能正常工作。如果您在注入初始化程序的模块定义/配置和类中使用它,则只会在此之前使用它。所以这可能对你有用。

选项 B

这相当难看,但可以正常工作:

将 api url 保存在一个单独的 javascript 文件中,如下所示:

window.userEnvironment = { host: "http://custom-host" };

在with:<head>部分加载此 javascript 。这样它在加载角度之前加载。这是由浏览器保证的!index.html<script src="user-env.js"></script>

现在在environment.ts文件中你可以这样做:

export const environment = {
  ...
};

const userEnv = (window as any).userEnvironment;
if (userEnv) Object.assign(environment, userEnv);

这将使用文件中的值覆盖环境值user-env.js

您不必在环境中这样做。你也可以在别的地方做。你只需要确保在environment使用之前就这样做。此外,如果您有多个环境,则需要在所有环境文件中使用它。

于 2020-07-14T10:26:39.690 回答