【发布时间】:2017-07-21 09:58:24
【问题描述】:
我正在尝试了解 Angular 4 中的核心模块和单例服务。 官方文档(https://angular.io/guide/ngmodule)说了以下几点:
UserService 是一个应用程序范围的单例。你不想每个 模块拥有自己的单独实例。然而有一个真正的危险 如果 SharedModule 提供 UserService,就会发生这种情况。
CoreModule 提供 UserService。 Angular 注册该提供者 使用应用程序根注入器,创建一个单例实例 UserService 可用于任何需要它的组件,无论是 组件被急切或延迟加载。
我们建议收集此类一次性类并隐藏它们 CoreModule 中的详细信息。简化的根 AppModule 导入 CoreModule 作为应用程序的编排器 整个。
import { CommonModule } from '@angular/common';
import { TitleComponent } from './title.component';
import { UserService } from './user.service';
import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';
@NgModule({
imports: [ CommonModule ],
declarations: [ TitleComponent ],
exports: [ TitleComponent ],
providers: [ UserService ]
})
export class CoreModule {
constructor (@Optional() @SkipSelf() parentModule: CoreModule) { ... }
}
所以我正在使用提供单例服务的核心模块和构造函数
constructor (@Optional() @SkipSelf() parentModule: CoreModule) { ... }
防止多次导入核心模块。
1) 但是,如果我在另一个模块中(例如在延迟加载模块中)提供 UserService 怎么办?这个延迟加载的模块有一个新的服务实例?
关于forRoot方法:
@NgModule({
imports: [ CommonModule ],
providers: [ UserService ]
})
export class CoreModule {
}
static forRoot(config: UserServiceConfig): ModuleWithProviders {
return {
ngModule: CoreModule,
providers: [
{provide: UserServiceConfig, useValue: config }
]
};
}
}
2) 如果我在 AppModule 中使用 CoreModule.forRoot() 导入 CoreModule,那么 UserService 会发生什么?也提供了吗?
谢谢
【问题讨论】:
标签: angular ng-modules