【问题标题】:Angular: How to import a module global that all other modules can access to it. (without re-importing in other modules)Angular:如何导入所有其他模块都可以访问的全局模块。 (无需在其他模块中重新导入)
【发布时间】:2019-02-15 19:44:24
【问题描述】:

我想为所有其他模块(路由中的子模块)全局使用 UI 框架。

我正在使用最新版本的 Angular 和 Material (7.2+)。 https://material.angular.io/

我创建了一个 Angular 模块,它可以导入所有 Angular Material UI 模块。 在app.module.ts 中导入。在我通过加载另一个模块更改路线之前,它工作正常。 - 我知道为什么。因为每个模块都是一个单独的范围。 但是应该可以全局导入一个模块,每个组件都可以访问 UI (html)。

我想导入 app.module.ts 中的所有 Mat..Modules(已经完成),也可用于我的其他模块,如 DashboardModule。 目前,我必须将 MaterialModules 再次导入每个模块组件(页面)。 我确定/希望这是可能的。因为整个页面都应该可以全局访问 UI。

【问题讨论】:

  • 最好的办法是创建一个共享模块并将该模块导入每个其他子模块中
  • 是的,我已经这样做了。我创建了一个模块“AllMaterialModules”,用于导入和导出所有 Mat...Modules。但我不想在其他所有模块中导入它。仅在 app.module.ts 中。

标签: angular angular-module global-scope


【解决方案1】:

我认为想要是不可能的。模块的全部意义在于封装它们的内容,并且只通过导出来公开特定的内容。另一方面,如果你想使用由另一个模块导出的东西,你必须导入它。没有“全局导入”

【讨论】:

    【解决方案2】:

    Angular 模块不是这样工作的。

    注意:此方法无效,如果找到解决方案将更新答案

    但是有一个解决方法,创建自己的装饰器来包装 NgModule 装饰器并在声明其他模块时使用它。

    这是一个例子:

    function CustomeNgModule(options: NgModule){
        options.imports = options.imports || []; 
        options.imports.push(SharedModule);
        return NgModule(options);
    }
    

    并将其用作,

    @CustomeNgModule({/*options*/})
    export class AbcModule {
    }
    

    我没有测试我的代码,但它应该可以工作,如果没有,请告诉我。

    如果需要更多关于装饰的信息https://www.typescriptlang.org/docs/handbook/decorators.html

    【讨论】:

    • @SimoneMSR,我在您发表评论后自己尝试过,并确认这不起作用。如果我解决了这个问题,我会更新我的答案。
    • 我也试过这个,但是不行prideparrot.com/blog/archive/2018/7/…
    • 同时您可以使用函数来转换选项,即使用转换函数 @NgModule(myTranform({/*options*/})) 代替 CustomNgModule 装饰器。
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多