0

我有很多代码,但我会尽量减少它。我正在尝试将服务转换为单例服务(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,它也有这些服务作为提供者。似乎现在一切正常。

4

0 回答 0