Angular 模块角度导入导出中的依赖关系
我有一个提供和导出服务的SharedModule,我希望通过引用共享模块typescript文件而不是服务typescript文件,将该服务导入另一个模块的组件中。但是构建失败了,因为在另一个组件中没有检测到导出的服务Angular 模块角度导入导出中的依赖关系,angular,Angular,我有一个提供和导出服务的SharedModule,我希望通过引用共享模块typescript文件而不是服务typescript文件,将该服务导入另一个模块的组件中。但是构建失败了,因为在另一个组件中没有检测到导出的服务 @NgModule({ imports: [ CommonModule ], declarations: [ ... ], providers : [ LookupService ], exports : [ L
@NgModule({
imports: [
CommonModule
],
declarations: [
...
],
providers : [
LookupService
],
exports : [
LookupService
]
})
export class SharedModule { }
然后将其导入到另一个功能模块中
@NgModule({
imports: [
CommonModule,
SharedModule,
],
declarations: [
LegalTermComponent
],
providers : [LegalTermService]
})
export class LegalTermModule { }
在LegalTermModule中的LegalTermComponent中,我想导入
import { LookupService } from '../shared/shared.module';
这就是build抱怨的地方
ERROR in src/app/legal-term/legal-term.component.ts(11,10): error TS2305: Module '".../src/app/shared/shared.module"' has no exported member 'LookupService'.
我不明白为什么它说没有导出的成员,而共享模块显然导出了它。谁能告诉我做这件事的正确方法吗?
(如果我直接参考lookup.service.ts,导入工作正常)
谢谢!
Anand可能是因为您没有导出LookupService类或没有将其定义为@Injectable()服务是具有根范围的单例。如果要确保提供的服务是应用程序级别的单例服务,则需要在AppModule中导入包含服务的模块。对于FeatureModule,您希望导入SharedModule而不导入任何服务-否则,它可以创建自己的服务副本,覆盖应用程序级服务(即延迟加载的模块)-这可能不是您想要的 为此,您应该遵循从共享模块创建两个静态方法的约定:一个方法返回带服务的模块,另一个方法返回不带服务的模块 只有FeatureModule才能导入没有服务的功能。带有服务的应用程序应该由AppModule导入 仅供参考,这就是为什么存在
forRoot
(带服务)和forChild
(不带服务)约定的原因
@NgModule({
imports: [
CommonModule
],
declarations: [
... (shared components)
],
providers : [
],
exports : [
... (shared components)
]
})
export class SharedModule {
// intended to be imported by AppModule
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [LookupService]
}
}
// intended to be imported by FeatureModules
static forChild(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: []
}
}
}
功能模块
@NgModule({
imports: [
CommonModule,
SharedModule.forChild(), //without services
],
declarations: [
LegalTermComponent
],
providers : [LegalTermService]
})
export class LegalTermModule { }
应用程序模块
@NgModule({
imports: [
SharedModule.forRoot(), //with services
],
declarations: [
...
],
providers : [
...
]
})
export class AppModule{ }
需要明确的是,提供者通常具有应用程序范围的根作用域,而不管它在哪个模块中提供。这是因为提供程序没有组件那样的模块作用域机制。唯一的例外是延迟加载的模块,它引入了自己的子根范围。legalTermComponent在哪里
sharedModule
?你能发布LookupService类吗?该服务运行良好,是@injectable的-我正在进行一些重新组织和重新考虑,并在这个过程中试图了解更多关于模块如何工作的信息。@injectable是一个运行时问题-不是构建问题。功能组件如何导入LookupService
从应用程序模块或功能模块中引用的共享模块的组件,不引用.ts文件?您需要导入ts文件,甚至是从共享模块。因此,尽管我有由共享模块导出的服务,该服务是从功能模块导入的,但在功能组件中,我仍然需要导入{LookupService}来自“../shared/lookup.service”代码>-所以我忽略了这里的要点-在从共享模块导出服务之前,我一直在这样做