Angular - 在模块定义中使用动态变量

2024-01-09

我有一个模块(带有@NgModule),我需要导入一个模块:

MqttModule.forRoot(environment.MQTT_SERVICE_OPTIONS)

问题是我不想从环境中获取值,而是从配置文件中获取值。

我创建了一个从配置文件加载属性的服务,但我不知道如何在模块定义类中使用它。 我在某些组件中使用它,一切都运行良好(只需通过构造函数注入),但在这里我没有相关的上下文。


我创建了一个从配置文件加载属性的服务,但我不知道如何在模块定义类中使用它。

您不能使用 Angular 服务,因为这需要初始化注入器。这ngModule需要配置beforeAngular 中的任何内容都已启动。

The root模块被加载plaformBrowserDynamic().bootstrapModule(AppModule)你的代码行main.ts文件。这是 Angular 中一切事物开始的地方。

您只需要在执行这行代码之前加载您的配置即可,并且不存在延迟此操作的技术问题。引导程序中此步骤的异步操作将显示空白页面,直到操作完成,这会导致用户体验不佳。

我可以通过改变来演示效果main.ts至以下内容:

(function () {
    return new Promise(resolver => {
        window.setTimeout(() => resolver(), 5000);
    });
})().then(() => {
    platformBrowserDynamic().bootstrapModule(AppModule)
        .catch(err => console.log(err));
});

上面的代码只是将 Angular 的引导延迟了 5 秒。

这是为什么您不应该在应用程序启动时异步加载资源的一个很好的理由,但如果您真的想这样做,那么它没有理由不起作用。

您需要更改承诺,以便它解析为您需要的配置设置,然后将其传递给您的静态函数AppModule.

我将更新我的示例,但假设您的最终源代码正在对远程配置文件发出 HTTP 请求。

(function () {
    return new Promise(resolver => {
        const exampleConfig = {
            options: 'ABC'
        };
        window.setTimeout(() => resolver(exampleConfig), 5000);
    });
})().then(config => {
    platformBrowserDynamic().bootstrapModule(AppModule.withConfig(config))
        .catch(err => console.log(err));
});

您现在必须手动创建模块定义AppModule,但这与模块的实现方式完全相同forRoot()方法。我刚刚将其重命名为withConfig()所以听起来更好。

@NgModule()
export class AppModule {
    static withConfig(config: any): ModuleWithProviders {
        return {
            ngModule: AppModule,
            imports: [
                MqttModule.forRoot(config)
            ]
        };
    }
}

我强烈建议后端服务器将所需的配置数据注入到index.html这样就不需要异步操作。然后您可以在中引用全局变量AppModule并跳过withConfig()步。这server应该负责引导程序stateAngular 应用程序的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular - 在模块定义中使用动态变量 的相关文章

随机推荐

  • Web应用前端和后端的误区

    我需要一些指导 建议 我决定构建一个 Web 应用程序 但我很难将所有组件组合在一起 我过去制作过基本的网站 但已经忘记了很多 我过去学过 JavaScript 和 Java 但我有点生疏 所以如果你决定回复 请把我当作一个对这一切都不熟悉
  • 如何将文件从一个目录移动到另一个目录?

    我是 python 初学者 我想将一些文件从一个目录移动到另一个目录 我现在必须使用一些模块 例如 Os 和 Shutil 我写了这段代码 但它返回一个错误 import shutil import os source os listdir
  • 如何使用 CSS 模块在 React 中设置子组件的样式

    我正在将 React 与 SASS 和 CSS 模块结合使用 如何在不传递新的 ClassName 或类似名称的情况下设置子组件的样式 对于前 我想在子组件上定位或执行一些样式 而不必给出特定的类 就像您所做的那样p span例如 所有跨度
  • 如何将 epub 文件下载到本地 iPhone 上?

    我想通过传递文件的 url 将 epub 文件下载到本地应用程序中 http www jedisaber com eBooks books sample epub http www jedisaber com eBooks books sa
  • 从 AsyncTask 检索对象值

    我正在创建异步任务 检索字符串数据 View OnClickListener btnClk new View OnClickListener Override public void onClick View v if btnGetData
  • 创建大于 23k x 23k 的巨大高分辨率位图

    我想创建一个巨大的分辨率位图图像 以便将其加载到内存中并根据用户手势进行转换 我注意到限制为new Bitmap int32 int32 大约是 23000 但我需要 1159480 x 45920 位深度为 32 有人可以帮助我吗 或者这
  • 如何在 tkinter 中取消选择 ttk.Treeview 中的行

    一旦我点击进入ttk Treeview 并选择一行 我可以单击另一行 但我无法UNSELECT所有行中 始终至少会选择 1 行 有没有一种聪明的方法可以取消选择最后选定的行 更改我使用的变量名称treeview ttk Treeview 并
  • Docker API 无法应用 json 过滤器

    根据https docs docker com engine reference api docker remote api v1 24 list tasks https docs docker com engine reference a
  • Rails 5.1 API - 如何允许嵌套 JSON 对象属性的参数

    关于这个主题至少有 10 个问题 但没有一个问题能回答这个特定问题 许多问题都与 Rails 表单相关 例如this https stackoverflow com questions 32529757 how can i get stro
  • 我只需要“身份网址”吗? - 开放ID

    我只是想知道我是否需要的只是身份 url 以便理论上将 OpenID 帐户附加到用户的帐户 我的身份网址如下所示 https www google com accounts o8 id id YGnyuGHMUmhUI98nuhUMhu98
  • 如何使用 Yarn v3 安装本地包?

    我尝试使用 Yarn v3 安装本地包 结果撞到了墙上 这是我尝试过的所有事情 Run yarn add file hardhat packager Run yarn add hardhat packager 手动添加 hardhat pa
  • 为什么 constexpr 上下文会使编译器失败,而它却无法完美优化?

    我玩过constexpr并实现了一些有趣的行为 在某些情况下添加constexpr在函数前面启用GCC尝试更加努力地优化 这会导致完全优化函数并仅提供计算值 然而 从一个调用这样一个完全优化的函数constexprcontext 会导致错误
  • 如何在 iOS Swift 中获取应用程序的 CFBundleURLSchemes

    我制作了一个演示项目 App1 其中添加了一个按钮 该按钮会将我重定向到已安装的应用程序 假设 App2 fitbit 我已经阅读了很多教程 并且基本上通过第二个答案了解了如何做到这一点 此应用程序不允许查询方案 cydia IOS9 错误
  • 在 ng-repeat 之后执行 jQuery 函数

    在此先感谢您的帮助 我正在用这个标签管理器 http welldonethings com tags manager在我的网络应用程序中 jQuery 函数在此之前工作正常
  • 具有多个模板参数包的部分模板专业化

    继续我的可变参数模板世界之旅 https stackoverflow com q 4691657 20984 我又遇到了一个问题 假设有以下模板类 template lt typename T gt struct foo default i
  • sqoop导入多个表

    我们正在使用 Cloudera CDH 4 并且能够按预期将表从 Oracle 数据库导入到我们的 HDFS 仓库中 问题是我们的数据库中有数十万张表 而 sqoop 一次只支持导入一张表 有哪些选项可用于将多个表导入 HDFS 或 Hiv
  • 覆盖 以切换 VS CODE 上的菜单栏

    我想要实现的目标如下 Disable ALT显示菜单栏toggle menu bar完全地 gt 潜在的地图ALT to a NULL action 使用不同的快捷方式toggle menu bar 有办法实现这一点吗 在 Ubuntu 上
  • 页面加载时的随机 Div 顺序 [重复]

    这个问题在这里已经有答案了 我有一堆 ID 为 gallerycard 的 div 我需要它们在用户每次访问页面时以随机顺序加载 div div Akulina div div N A div div div div Martina div
  • 如何处理 Doctrine2 SELECT 查询中 DateTime 类型的默认值?

    我有以下 Doctrine2 实体
  • Angular - 在模块定义中使用动态变量

    我有一个模块 带有 NgModule 我需要导入一个模块 MqttModule forRoot environment MQTT SERVICE OPTIONS 问题是我不想从环境中获取值 而是从配置文件中获取值 我创建了一个从配置文件加载