这是我的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 { }
[请注意,我仅将Imports
和CommonModule
添加到IconModule
。我这样做是因为我在RequiredActionDirective
中使用了这些模块。但是Exports
具有更多的模块,因为它将被导入SharedModule
的其他模块使用。
问题:我是否正确地认为我不需要将模块添加到Imports
中,除非我想直接在SharedModule
中使用它们?还是将来可能存在一些我目前不知道的问题,因为现在一切都正常了?
您不应无故重新导出模块,而只能导入当前模块所依赖的模块。对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 {}
原因是HttpClientModule
在SharedModule
级别的提供者树中声明,并从该点解析所有HTTP_INTERCEPTORS
down。
[要求是AppModule
应该先导入HttpClientModule
,然后再导入SharedModule
。
NgModule({
imports: [HttpClientModule, SharedModule],
provide: { provide: HTTP_INTERCEPTORS, useClass: AppInterceptor, multi: true }
})
export class AppModule {}
现在HttpClientModule
在AppModule
级别声明,并解析包括SharedModule
在内的所有提供程序downwards。 imports: []
数组中的顺序并不重要。