Angular 2 - Singleton сервис, вызывающий проблемы с впрыском с другим сервисом - PullRequest
0 голосов
/ 12 июня 2018

У меня много кода, но я постараюсь его сократить.Я пытаюсь превратить сервис в одноэлементный сервис (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();
    }

AddGroupComponent

@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 Ошибка: StaticInjectorError (MgrModule) [TagsComponent -> ApiService]: StaticInjectorError (платформа: ядро) [TagsComponent -> ApiService]: NullInjectorError: Нет поставщика для ApiService!

Я понимаю, что это такУ меня нет провайдера.Мне кажется, что все TagComponents уже используют ApiService в качестве одиночного (он создается только один раз).Но я не совсем уверен, что происходит.

РЕДАКТИРОВАТЬ:

Я добавил ApiService для провайдеров ngModule и удалил его из других провайдеров.Теперь все работает, но я добавил console.logs в свои конструкторы служб, и когда я нажимаю кнопку, чтобы создать AddGroupComponent, новые ApiService и TagService все еще создаются (но просто, когда я нажимаю его много раз, они не создаются снова).Так что сейчас он создает их дважды (один раз при загрузке страницы и второй раз при нажатии кнопки, которая открывает AddGroupComponent.

EDIT 2:

Nevermind, у меня был другой файл с именем app.component.ts, у которого был общий MgrComponent, который также имел эти сервисы в качестве поставщиков. Похоже, что теперь все работает.

...