Aggiornamento (Angolare 6 +)
Il modo consigliato per creare un servizio singleton è cambiato. Si consiglia ora di specificare nel @Injectable
decoratore sul servizio che dovrebbe essere fornito in 'root'. Questo ha molto senso per me e non è più necessario elencare tutti i servizi forniti nei moduli. Basta importare i servizi quando ne hai bisogno e si registrano nel posto giusto. È inoltre possibile specificare un modulo in modo che venga fornito solo se il modulo viene importato.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Aggiornamento (Angolare 2)
Con NgModule, il modo per farlo ora penso sia creare un 'CoreModule' con la tua classe di servizio al suo interno ed elencare il servizio nei provider del modulo. Quindi importa il modulo principale nel modulo dell'app principale che fornirà un'istanza a tutti i bambini che richiedono quella classe nei loro costruttori:
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 { }
Risposta originale
Se elenchi un fornitore bootstrap()
, non è necessario elencarlo nel decoratore dei componenti:
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) {}
}
In effetti, elencare la tua classe in "provider" ne crea una nuova istanza, se qualche componente genitore la elenca già allora i figli non ne hanno bisogno e se lo fanno otterranno una nuova istanza.
UserService
eFacebookService
diproviders
altrove?