我正在阅读有关模块的Angular文档,寻找不鼓励在AppModule内部导入SharedModule的行。
我什么都没找到,只是一个GitHub问题,指出最好不要导入它。但是没有任何深入的解释...
https://github.com/tomastrajan/angular-ngrx-material-starter/issues/47
我不赞成在共享模块中提供服务。但是没有别的。
所以我的问题是:
由于我所有的功能模块都是延迟加载的,并且需要导入共享模块,而且我的应用程序组件也需要使用同一共享模块提供的内容,因此将其导入AppModule是一种不好的做法吗? / p>
后果可能是什么?
预先感谢任何人
答案 0 :(得分:5)
将SharedModule
导入到AppModule
中的问题在于,提供程序将在功能模块中注入两次(一次由SharedModule
注入,一次由AppModule
注入) ),这将导致服务不像预期的那样单身。
要实现的常见模式不是像这样直接在@NgModule
声明中公开提供程序,而是在静态forRoot
函数中(该名称不是强制性的,这是一个约定):
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [
...
]
};
}
}
将SharedModule
导入AppModule
时,请使用SharedModule.forRoot()
,将其导入功能模块时,只需将其导入为SharedModule
答案 1 :(得分:2)
只需查看此链接shared module,在AppModule
中导入共享模块就不是一个坏习惯
共享模块是关于拥有通用模块的,例如,如果您有form module
some module
,这是所有模块都需要的,而不是导入所有模块,则可以在shared module
中将其导入并导出一样-检查链接以进一步澄清
对于服务,它可以仅注入AppModule
中的一个模块中-服务为injectable
,并且如果已将其注入根模块中,则可以在任何模块中使用
@Injectable({
providedIn: 'root'
})
在您的服务顶部使用此装饰器,它将自动将您的服务插入根模块
谢谢-编码愉快!!
答案 2 :(得分:0)
只要您避免在共享模块中声明服务,我就不会发现任何问题。