Оновлення (кутова 6 +)
Рекомендований спосіб створення одиночної послуги змінився. Тепер рекомендується в @Injectable
декораторі вказати на сервісі, що він повинен надаватися у "корені". Це має для мене багато сенсу, і більше не потрібно перераховувати всі надані послуги у ваших модулях. Ви просто імпортуєте сервіси, коли вони вам потрібні, і вони зареєструються в потрібному місці. Ви також можете вказати модуль, щоб він був наданий лише у випадку імпорту модуля.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Оновлення (кутова 2)
Що стосується NgModule, я думаю, що це зробити зараз, я думаю, це створити "CoreModule" з класом обслуговування в ньому та перелічити службу в постачальників модулів. Потім ви імпортуєте основний модуль у свій основний модуль додатка, який надасть один екземпляр будь-яким дітям, які запитують цей клас у своїх конструкторах:
CoreModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ApiService } from './api.service';
@NgModule({
imports: [
CommonModule
],
exports: [ // components that we want to make available
],
declarations: [ // components for use in THIS module
],
providers: [ // singleton services
ApiService,
]
})
export class CoreModule { }
AppModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AppComponent } from './app.component';
import { CoreModule } from './core/core.module';
@NgModule({
declarations: [ AppComponent ],
imports: [
CommonModule,
CoreModule // will provide ApiService
],
providers: [],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Оригінальний відповідь
Якщо ви перераховуєте провайдера в bootstrap()
, вам не потрібно перераховувати їх у вашому декораторі компонентів:
import { ApiService } from '../core/api-service';
@Component({
selector: 'main-app',
templateUrl: '/views/main-app.html',
// DO NOT LIST PROVIDERS HERE IF THEY ARE IN bootstrap()!
// (unless you want a new instance)
//providers: [ApiService]
})
export class MainAppComponent {
constructor(private api: ApiService) {}
}
Фактично перерахування вашого класу на «провайдерів» створює його новий екземпляр, якщо якийсь батьківський компонент вже перелічив його, то дітям цього не потрібно, і якщо вони будуть, вони отримають новий екземпляр.
UserService
іFacebookService
вproviders
іншому місці?