У меня много кода, но я постараюсь его сократить.Я пытаюсь превратить сервис в одноэлементный сервис (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, который также имел эти сервисы в качестве поставщиков. Похоже, что теперь все работает.