Angular2 从子模块导入并声明全局服务
Angular2 import and declare global service from submodule
我有一个有趣的问题。我有 2 个模块。 app.module.ts (AppModule) 和 listings.module.ts (ListingsModule)。 ListingsModule 有一个服务,我们称它为服务 A。A 需要是一个单例全局服务,这意味着所有其他组件和服务都需要能够与同一个 A 进行交互。
为此,我首先尝试在 ListingsModule 中将 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 那么它会给我另一个错误。我显然只能提供这项服务。
这里正确的方法是什么?我该怎么做?
您的 ListingsStoreService 必须导入
imports: [
SharedModule,
HeaderModule,
ListingsRoutingModule,
ListingsStoreService
],
我认为这是你的问题。你能试试这个吗?我已经写了一条评论,但我需要 50 个声望...所以这里是一个我不知道 100% 是否有效的答案。
无需特殊配置即可使用。默认情况下,服务具有全局范围(只要声明它们的模块是预先加载的)。您的初始配置(您在问题中描述的)应该有效。
在 ListingsModule
的提供商中声明您的服务:
@NgModule({
providers: [ ListingsStoreService ]
})
export class ListingsModule {
}
然后在AppModule
中导入ListingsModule
:
@NgModule({
imports: [ ListingsModule ]
})
export class AppModule {
}
注意。 ListingsModule
必须预先加载,而不是 lazy-loaded。您的问题没有说明 ListingsModule
是如何加载到您的案例中的。
angular 对其某些模块(例如 RouterModule)所做的是允许通过名为 "forRoot" 和 "forChild" 的静态函数创建同一模块的两个版本, 按照惯例。 "forRoot" 可以包含全局服务,例如在其提供者数组中的 "ListingsStoreService",而 "forChild" 将忽略它。然后你可以在 AppModule 导入数组中调用 "ListingsModule.forRoot()",并在你需要 "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: []
};
};
};
我有一个有趣的问题。我有 2 个模块。 app.module.ts (AppModule) 和 listings.module.ts (ListingsModule)。 ListingsModule 有一个服务,我们称它为服务 A。A 需要是一个单例全局服务,这意味着所有其他组件和服务都需要能够与同一个 A 进行交互。
为此,我首先尝试在 ListingsModule 中将 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 那么它会给我另一个错误。我显然只能提供这项服务。
这里正确的方法是什么?我该怎么做?
您的 ListingsStoreService 必须导入
imports: [
SharedModule,
HeaderModule,
ListingsRoutingModule,
ListingsStoreService
],
我认为这是你的问题。你能试试这个吗?我已经写了一条评论,但我需要 50 个声望...所以这里是一个我不知道 100% 是否有效的答案。
无需特殊配置即可使用。默认情况下,服务具有全局范围(只要声明它们的模块是预先加载的)。您的初始配置(您在问题中描述的)应该有效。
在 ListingsModule
的提供商中声明您的服务:
@NgModule({
providers: [ ListingsStoreService ]
})
export class ListingsModule {
}
然后在AppModule
中导入ListingsModule
:
@NgModule({
imports: [ ListingsModule ]
})
export class AppModule {
}
注意。 ListingsModule
必须预先加载,而不是 lazy-loaded。您的问题没有说明 ListingsModule
是如何加载到您的案例中的。
angular 对其某些模块(例如 RouterModule)所做的是允许通过名为 "forRoot" 和 "forChild" 的静态函数创建同一模块的两个版本, 按照惯例。 "forRoot" 可以包含全局服务,例如在其提供者数组中的 "ListingsStoreService",而 "forChild" 将忽略它。然后你可以在 AppModule 导入数组中调用 "ListingsModule.forRoot()",并在你需要 "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: []
};
};
};