我应该将模块添加到SharedModule-Angular中的导入吗?

问题描述 投票:0回答:1

这是我的SharedModule

import { CommonModule } from "@angular/common";
import { NgModule } from "@angular/core";
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
import { IconModule } from "@my-app/components/icon/icon.module";
import { RequiredActionDirective } from "@my-app/directives/required-action.directive";

@NgModule({
    imports: [
        CommonModule,
        IconModule
    ],
    declarations: [
        RequiredActionDirective
    ],
    exports: [
        CommonModule,
        IconModule,
        FormsModule,
        ReactiveFormsModule,
        RequiredActionDirective
    ]
})
export class SharedModule { }

[请注意,我仅将ImportsCommonModule添加到IconModule。我这样做是因为我在RequiredActionDirective中使用了这些模块。但是Exports具有更多的模块,因为它将被导入SharedModule的其他模块使用。

问题:我是否正确地认为我不需要将模块添加到Imports中,除非我想直接在SharedModule中使用它们?还是将来可能存在一些我目前不知道的问题,因为现在一切都正常了?

angular typescript angular-module shared-module
1个回答
0
投票

您不应无故重新导出模块,而只能导入当前模块所依赖的模块。对import没有害处,但是exporting在提供程序的依赖关系树中创建了branch

一旦模块重新导出模块,导入它的父模块将无法覆盖该导入。因此在某些情况下这可能是个问题。

例如;

NgModule({
     imports: [HttpClientModule],
     provide: { provide: HTTP_INTERCEPTORS, useClass: ExampleInterceptor, multi: true },
     exports: [HttpClientModule]
})
export class SharedModule {}

现在AppModule无法提供其他拦截器。

NgModule({
     imports: [SharedModule],
     provide: { provide: HTTP_INTERCEPTORS, useClass: AppInterceptor, multi: true }
     // ^^ interceptor is ignored
})
export class AppModule {}

原因是HttpClientModuleSharedModule级别的提供者树中声明,并从该点解析所有HTTP_INTERCEPTORS down

[要求是AppModule应该先导入HttpClientModule,然后再导入SharedModule

NgModule({
     imports: [HttpClientModule, SharedModule],
     provide: { provide: HTTP_INTERCEPTORS, useClass: AppInterceptor, multi: true }
})
export class AppModule {}

现在HttpClientModuleAppModule级别声明,并解析包括SharedModule在内的所有提供程序downwardsimports: []数组中的顺序并不重要。

© www.soinside.com 2019 - 2024. All rights reserved.