Сервис создается каждый раз — Angular

#javascript #html #css #angular #typescript

#javascript #HTML #css #angular #typescript

Вопрос:

Я хотел бы создать сервис только 1 раз.

Мой сервис вводится в 2 компонента, и я устанавливаю значение true. Проблема в том, что сервис создается всегда, когда я открываю представление с ним, и мое значение по умолчанию снова равно false. Как сделать его одноэлементным?

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

@Injectable({
  providedIn: 'root'
})
export class GlobalStateService {

  constructor() {
    console.log('GlobalState created');
  }

  myValue = false;
}
  

и я использую его таким образом:

 @Component({
  selector: 'app-nav',
  templateUrl: './nav.component.html',
  styleUrls: ['./nav.component.css']
})
export class NavComponent implements OnInit {

  model: any = {};
  permission: any;

  constructor(public authService: AuthService,
              private alertifyService: AlertifyService,
              private globalState: GlobalStateService) {
  }
  

модуль:

 import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';
import {HttpClientModule} from '@angular/common/http';
import {FormsModule} from '@angular/forms';

import {AppComponent} from './app.component';
import {NavComponent} from './nav/nav.component';
import {AuthService} from './_services/auth.service';
import {HomeComponent} from './home/home.component';
import {RegisterComponent} from './register/register.component';
import {AlertifyService} from './_services/alertify.service';
import { SettingsComponent } from './settings/settings.component';
import { BooksComponent } from './books/books.component';
import { UsersComponent } from './users/users.component';
import { GlobalStateService } from './_services/global-state.service';
import { StoreModule } from '@ngrx/store';
import { changeTabReducer } from './reducers/tab.reducer';

@NgModule({
  declarations: [
    AppComponent,
    NavComponent,
    HomeComponent,
    RegisterComponent,
    SettingsComponent,
    BooksComponent,
    UsersComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    FormsModule
  ],
  providers: [
    AuthService,
    AlertifyService,
    GlobalStateService
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}
  

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

1. Если внедрение зависимостей реализовано правильно, оно должно внедрить только один экземпляр вашей службы в ваши компоненты. Если этого не происходит, вероятно, это связано с неправильной реализацией. Можете ли вы включить код модулей и компонентов, использующих ваш сервис?

2. Я добавил: «Это хорошо?» или что — то большее ?

3. Можете ли вы добавить весь навигационный компонент (например, там, где используется сервис), а также второй компонент, в котором используется сервис.

Ответ №1:

Есть два способа сделать сервис одноэлементным в Angular:

  1. Объявите, что сервис должен предоставляться в корне приложения.
  2. Включите сервис в AppModule или в модуль, который импортируется только AppModule.

Из документов, documentation ? Вам нужно указать в @Injectable декораторе сервиса, что он должен быть предоставлен в «корне».

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

@Injectable({
  providedIn: 'root',
})
export class GlobalStateService {
}
  

Который выглядит хорошо на основе кода, однако ОБРАТИТЕ ВНИМАНИЕ: украсьте его @Injectable({providedIn: 'root'}) и do not provide it in any providers array.

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

1. и внедрять его во все службы через конструктор, как я это делал? ну, это не работает

2. проверьте сейчас, я добавил

3. удалите GlobalStateService из раздела providers, который должен работать, как я упоминал в комментарии

4. не работает без этого, я добавил это сейчас, но также не работает

5. сервис создается каждый раз, когда новый