Служба Angular не действует как синглтон при введении в компоненты, несмотря на использование декоратора @Injectable({providedIn: ‘root’ })

#angular #service #routes #navigation #singleton

#angular #Обслуживание #маршруты #навигация #синглтон

Вопрос:

У меня есть проект, который содержит два модуля (AppModule по умолчанию и модуль маршрутизации, сгенерированный angular cli при создании проекта), два компонента, которые я создал, и службу, которую я ввел в конструктор каждого компонента. Я ожидал, что у меня будет один и тот же экземпляр службы (singleton каждый раз, когда я внедряю службу, поскольку у нее есть декоратор @Injectable ({providedIn: ‘root’ })), но я продолжаю получать совершенно новый экземпляр моей службы каждый раз, когда я перехожу к каждому из моих компонентов. вот мой код ниже :

app.module.html

 <router-outlet></router-outlet>
  

app.module.ts

 import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { TestComponent } from './test/test.component';
import { Test2Component } from './test2/test2.component';


@NgModule({
  declarations: [
    AppComponent,
    TestComponent,
    Test2Component
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
  

app-routing.module.ts

 import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { TestComponent } from './test/test.component';
import { Test2Component } from './test2/test2.component';

const routes: Routes = [
  { path: 'test1', component: TestComponent },
  { path: 'test2', component: Test2Component }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }
  

test.component.ts

 import { Component} from '@angular/core';
import { TestService } from '../test.service';

@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./test.component.css']
})
export class TestComponent {

  constructor(private _testService: TestService) { }
}
  

test2.component.ts

 import { Component } from '@angular/core';
import { TestService } from '../test.service';

@Component({
  selector: 'app-test2',
  templateUrl: './test2.component.html',
  styleUrls: ['./test2.component.css']
})
export class Test2Component {

  constructor(private _testService: TestService) { }

}
  

test.service.ts

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

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

  private date = new Date();

  constructor() {
    console.log("Inside the service ", this.date);
  }

}
  

Ответ №1:

Ваш сервис действительно одноэлементный, судя по коду.

Вставьте это в app.component.html и попробуйте ссылки:

 <nav>
  <ul>
    <li><a routerLink="child-a">Child A</a></li>
    <li><a routerLink="child-b">Child B</a></li>
  </ul>
</nav>
  

Я подозреваю, что вы пытаетесь проверить два компонента, записав URL-адрес в навигационной панели браузера, поэтому вы перезагружаете приложение в любое время, когда считаете, что перенаправляете. Может быть, это так?

Здесь я создал рабочий пример маршрутизации и использования одноэлементной службы.

Вы можете видеть, что после нескольких щелчков конструктор запустился только один раз в консоли: введите описание изображения здесь

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

1. Спасибо. Ваше решение отлично работает для меня. Я думаю, это было потому, что я не использовал модуль маршрутизатора. Вместо этого я использовал строку URL браузера и кнопку перезагрузки, чтобы изменить URL. это приводит к тому, что приложение перезагружается каждый раз, и все мои службы должны быть повторно утверждены. Поэтому, когда мы назначаем URL-адрес на панели навигации и нажимаем enter, например, мы отправляем запрос на сервер, чтобы получить index.html снова файл, что означает, что приложение снова перезагружается.

Ответ №2:

Предоставьте свой тестовый сервис в массиве providers в app.module.ts следующим образом. Для создания синглтона.
Поставщики:[TestService]

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

1. Нет необходимости. «Начиная с Angular 6.0, предпочтительный способ создания одноэлементной службы — установить для providedIn значение root в декораторе службы @Injectable(). » от: angular.io/guide /…

Ответ №3:

Смотрите ссылку ниже:https://www.w3resource.com/angular/angular-singleton-service.php

вам необходимо зарегистрировать свой сервис в app.module.ts в качестве поставщика.

 providers: [{provide: Service}]
  

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

1. Нет необходимости. «Начиная с Angular 6.0, предпочтительный способ создания одноэлементной службы — установить для providedIn значение root в декораторе службы @Injectable(). » от: angular.io/guide /…