我有个有趣的问题。我有两个模块。app.module.ts (AppModule)和listings.module.ts (ListingsModule)。ListingsModule有一个服务,我们称之为服务A。A需要是一个单一的全局服务,这意味着所有其他组件和服务都需要能够与相同的A交互。
为此,我首先尝试将A声明为ListingsModule中的提供程序,但这不像预期的那样工作,因为它只是被声明为用于ListingsModule下的组件和服务的单例,但我还需要在其他模块和AppModule下使用它。因此,我得出的结论是,我需要从ListingsModule导出此服务,并在AppModule下导入和提供该服务,但这并不像预期的那样有效。
A是ListingsStoreService。
//Stores
import { ListingsStoreService } from './shared/listings-store.service';
//Modules
import { SharedModule } from './../shared/shared.module';
import { HeaderModule } from './../header/header.module';
@NgModule({
imports: [
SharedModule,
HeaderModule,
ListingsRoutingModule
],
declarations: [
ListingsComponent
],
exports: [
ListingsStoreService
],
providers: [ ]
})
export class ListingsModule {
}下面的代码要求我声明或导入ListingsStoreService,以便它是可导出的。如果我声明ListingsStoreService,那么它会给我另一个错误。显然我只能提供这项服务。
这里的正确方法是什么?我该怎么做呢?
发布于 2017-02-06 10:55:49
角对它的一些模块(例如RouterModule)所做的是允许通过称为"forRoot“和"forChild”的静态函数,按照约定创建相同模块的两个版本。"forRoot“可以包含一个全局服务,例如它的提供者数组中的"ListingsStoreService”,而"forChild“将省略它。然后,您可以在ListingsModule.forRoot imports数组中调用"ListingsModule.forChild()“,并在任何需要"ListingsModule”的地方调用“ListingsModule.forChild()”。
@NgModule({
imports: [
SharedModule,
HeaderModule,
ListingsRoutingModule
],
declarations: [
ListingsComponent
]
})
export class ListingsModule {
static forRoot() : ModuleWithProviders {
return {
ngModule: ListingsModule,
providers: [ ListingsStoreService ]
};
};
static forChild() : ModuleWithProviders {
return {
ngModule: ListingsModule,
providers: []
};
};
};发布于 2017-02-06 09:19:50
您的ListingsStoreService必须导入
imports: [
SharedModule,
HeaderModule,
ListingsRoutingModule,
ListingsStoreService
],我觉得这是你的问题。你能试试这个吗?我已经写过评论了,但我需要50个名誉.因此,这里有一个答案,我不知道100%,如果它起作用。
发布于 2017-02-06 10:22:23
它应该在没有特殊配置的情况下工作。默认情况下,服务具有全局范围(,只要声明它们的模块是热切加载的)。您的初始配置(您在问题中所描述的)应该可以工作。
在ListingsModule提供程序中声明服务
@NgModule({
providers: [ ListingsStoreService ]
})
export class ListingsModule {
}然后在ListingsModule中导入AppModule
@NgModule({
imports: [ ListingsModule ]
})
export class AppModule {
}注意:必须急切地加载ListingsModule,而不是延迟加载。您的问题并没有说明如何在您的情况下加载ListingsModule。
https://stackoverflow.com/questions/42063998
复制相似问题