0

这是我的共享模块

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 { }

请注意,我Imports只添加了CommonModuleand IconModule。我这样做是因为我在我的RequiredActionDirective. 但是Exports有更多的模块,因为将被其他导入的模块使用SharedModule

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

4

1 回答 1

0

您不应该无缘无故地重新导出模块,而只导入当前模块所依赖的模块。导入没有害处,但导出会在提供者的依赖树中创建一个分支

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

例如;

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 {}

原因是HttpClientModule在级别的提供程序树中声明了,并从该点向下SharedModule解析所有内容。HTTP_INTERCEPTORS

要求是AppModule应该首先导入HttpClientModule,然后是SharedModule.

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

现在HttpClientModule在级别声明并向AppModule解析所有提供程序,包括. 数组中的顺序并不重要。SharedModuleimports: []

于 2020-01-14T19:22:52.387 回答