【问题标题】:Inherit imports from parent module to child module in Angular2在Angular2中从父模块继承导入到子模块
【发布时间】:2017-02-12 19:46:27
【问题描述】:

我制作了一个 Angular2 应用程序,如 here 所述。它有两个组件 (A,B),由全局 app.module 导入。我的想法是,在app.module 中包含共享模块,这样我就不需要用冗余代码来搞乱每个模块。例如,我想用FormsModule 做到这一点。所以在app.module我有

imports: [
    UniversalModule,
    CommonModule,
    FormsModule,
    AModule
    RouterModule.forRoot([])
],

exports: [FormsModule]

但在 A 模块中,我得到了异常 Can't bind to 'ngModel' since it isn't a known property of 'select'.,这似乎是由缺少 FormsModule 引起的。只有当我也使用imports: [FormsModule] 在每个子模块中导入FormsModule 时,它才有效。这正是我想要避免的。

根据this question,我尝试在子模块A中导入AppModule。这不起作用并给我异常Exception: Call to Node module failed with error: Error: Unexpected value 'undefined' imported by the module 'AModule'

如何将导入继承到子模块?我也需要这个来做管道。

【问题讨论】:

    标签: angular single-page-application angular2-modules


    【解决方案1】:

    只需创建一个功能模块(或共享模块)来导出通常一起使用的组件、指令和管道,然后将此模块导入您想要使用其中任何一个的模块。

    无法使组件、指令或管道在全球范围内可用。需要将它们添加到使用它们的每个模块的导入中。 您所能做的就是组合模块并通过仅导入一个或几个模块来使它们可用。

    【讨论】:

    • 您可以将任何您想要的模块导入到除父模块之外的另一个模块中。这非常很奇怪。我认为使用子模块根本不是一个好主意。这让我想把所有东西都展平,避免完全使用子模块,这样我就可以导入我需要的任何东西。
    【解决方案2】:

    似乎这只能使用共享模块来完成,该模块收集共享导入,就像@Günter Zöchbauer 说的那样。我找到了an example in the official docs,我用它作为基础来创建我的共享模块:

    import { CommonModule } from '@angular/common';
    import { NgModule } from '@angular/core';
    import { FormsModule } from '@angular/forms';
    
    import { ObjectKeysPipe } from './../shared/pipes/object-keys.pipe';
    
    @NgModule({
        imports: [CommonModule],
        declarations: [
            ObjectKeysPipe
        ],
        exports: [
            CommonModule,
            FormsModule,
            ObjectKeysPipe
        ]
    })
    export class GlobalSharedModule{}
    

    这与我共享一个自定义管道 (ObjectKeysPipe),并广泛使用 CommonModuleFormModule。减少冗余混乱的想法奏效了。在我的应用程序模块中,我不需要添加一堆导入/声明。相反,我只需要像这样导入我的共享模块:

    import { GlobalSharedModule } from './../shared/global-shared.module';
    @ngModule({
        imports: GlobalSharedModule
    })
    

    【讨论】:

    • 一个目标是不使用./../../../../../ 链上的链来导入模块。有什么办法吗?
    • @DouglasGaskell 在tsconfig.json 下的compilerOptionspaths 中,您可以声明类似"store": ["src/store.ts"] 的路径。见link
    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2017-05-21
    • 2019-12-30
    • 2020-12-06
    • 2020-06-09
    • 2016-10-31
    相关资源
    最近更新 更多