Одноэлементная служба Angular создает несколько новых экземпляров, несмотря на корневую инъекцию и объявление отдельных поставщиков

#angular #service #singleton #angular-services

#angular #Обслуживание #одноэлементный #angular-services

Вопрос:

Я пытаюсь создать службу, которая содержит переменные, которые мое веб-приложение Angular разделяет между компонентами (компоненты, которые могут считывать и записывать в эти переменные). Из-за этого мне нужно, чтобы это была одноэлементная служба, но мне не повезло, так как с каждым новым компонентом создается новый экземпляр.

Служба (GlobalService) объявляется следующим образом:

 import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})

export class GlobalService {

  currentUser: string = null;
  currentProject: string = null;
  currentProjectName: string = null;
  canEditInProject: boolean = null;

  constructor() {
    console.log('in global service constructor');
  }
  

с методами getter и setter, определенными после.

В app.module.ts у меня есть следующее:

 @NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    FontAwesomeModule,
    FlexLayoutModule,
    RouterModule.forRoot([]),
    LayoutModule,
    MDBBootstrapModule.forRoot(),
    BrowserAnimationsModule,
    HttpClientModule,
  ],
  providers: [GlobalService],
  bootstrap: [AppComponent]
})
  

где он объявлен в providers . Я искал свой проект, и в службе нет других операторов поставщика.

Каждый компонент, который его использует (1), имеет оператор импорта сверху, а затем (2) объявляет закрытую переменную в своем конструкторе, например:

 constructor(private globalService: GlobalService)
  

и использует переменную this.globalService для получения или установки служебных переменных.

Тем не менее, при каждой новой загрузке страницы я вижу из своего оператора печати в global.service.ts, что вызывается конструктор и создается новый экземпляр. Тогда, конечно, все мои переменные равны нулю, и ничего не сохраняется.

Есть идеи, что происходит не так? Или какие-либо другие идеи решения? Раньше я пробовал использовать localStorage и sessionStorage, но там тоже была некоторая нестабильность…. Я в тупике

Комментарии:

1. Я почти уверен, что если вы поставили: ` @Injectable({ providedIn: ‘root’, }) `, вам больше не нужно помещать свой GlobalService в providers. Вы случайно не пробовали это?

2. Я только что пробовал, но безуспешно. Есть идеи, возможно ли, что весь экземпляр моего приложения перезапускается с определенными вызовами компонентов?

3. Как вы переходите к другим вашим компонентам, потому что RouterModule.forRoot([]) пуст?

4. Я довольно новичок в Angular, поэтому я не могу быть уверен, но у меня есть отдельный макет-routing.module, который имеет @NgModule({ объявления: [], импорт: [ FontAwesomeModule, RouterModule.forChild(маршруты) ], экспорт: [RouterModule] }) вместе со всемимаршруты, определенные над ним. И тогда каждый компонент имеет свой собственный модуль модуль маршрутизации. Рад предоставить более подробную информацию в редактировании, если вы считаете, что это может быть причиной

5. Пока вы используете только один RouterModule.forRoot([]), все должно быть в порядке.