我有很多代码,但我会尽量减少它。我正在尝试将服务转换为单例服务(TagService)。但这似乎引起了问题。我有很多组件和服务,但我会将其简化为 AddGroupComponent、TagComponent、TagService 和 ApiService。
为了创建一个单例 TagService,我将它添加到 app.module.ts:
import {TagService} from './services/TagService';
const appRoutes: Routes = [
...
];
@NgModule({
declarations: [
TagComponent,
...
],
imports: [
...
],
entryComponents: [AddGroupComponent, ... ]
providers: [TagService], // added this here
})
export class AppModule {
}
这是我的 TagService,我没有在这里更改任何内容:
import {ApiService} from '../ApiService/ApiService';
@Injectable()
export class TagService {
constructor(private api: ApiService) {
....
}
这些是我想将 TagService 用作共享单例的一些组件。
// Didn't change anything here
@Component({
...
providers: []
})
export class TagComponent {
constructor(private api: ApiService, private tagService: TagService) {
super();
}
添加组组件
@Component({
...
providers: [ApiService, PermissionsService] // I removed TagService from here
})
export class AddGroupComponent {
constructor(private api: ApiService, private tagService: TagService) {
...
}
有了这个我得到错误:
AddGroupComponent_Host.ngfactory.js?[sm]:1 ERROR 错误:StaticInjectorError(MgrModule)[TagsComponent -> ApiService]: StaticInjectorError(Platform: core)[TagsComponent -> ApiService]: NullInjectorError: No provider for ApiService!
我知道它没有提供者。在我看来,所有的 TagComponents 都已经将 ApiService 用作单例(它只创建一次)。但我不确定发生了什么。
编辑:
我将 ApiService 添加到 ngModule 提供程序,并将其从其他提供程序中删除。现在一切正常,但是我将 console.logs 添加到了我的服务构造函数中,当我按下按钮创建 AddGroupComponent 时,仍然会创建一个新的 ApiService 和 TagService(但是,当我多次按下它时,它们不会再次创建)。所以现在它会创建它们两次(一次是在加载页面时,第二次是在单击打开 AddGroupComponent 的按钮时。
编辑2:
没关系,我有另一个名为 app.component.ts 的文件,它有一个通用的 MgrComponent,它也有这些服务作为提供者。似乎现在一切正常。