#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 /…