Update (Winkel 6 +)
Die empfohlene Methode zum Erstellen eines Singleton-Dienstes wurde geändert. Es wird jetzt empfohlen, im @Injectable
Dekorator des Dienstes anzugeben, dass er im 'root' bereitgestellt werden soll. Dies ist für mich sehr sinnvoll und es besteht keine Notwendigkeit mehr, alle bereitgestellten Dienste in Ihren Modulen aufzulisten. Sie importieren die Dienste nur dann, wenn Sie sie benötigen, und sie registrieren sich an der richtigen Stelle. Sie können auch ein Modul angeben, damit es nur bereitgestellt wird, wenn das Modul importiert wird.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Update (Winkel 2)
Mit NgModule besteht die Möglichkeit, dies jetzt zu tun, darin, ein 'CoreModule' mit Ihrer Serviceklasse darin zu erstellen und den Service bei den Anbietern des Moduls aufzulisten. Anschließend importieren Sie das Kernmodul in Ihr Haupt-App-Modul, das allen Kindern, die diese Klasse in ihren Konstruktoren anfordern, die eine Instanz bereitstellt:
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 { }
Ursprüngliche Antwort
Wenn Sie einen Anbieter in auflisten bootstrap()
, müssen Sie ihn nicht in Ihrem Komponentendekorator auflisten:
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) {}
}
Wenn Sie Ihre Klasse in "Provider" auflisten, wird eine neue Instanz davon erstellt. Wenn eine übergeordnete Komponente sie bereits auflistet, müssen die untergeordneten Komponenten dies nicht tun. In diesem Fall erhalten sie eine neue Instanz.
UserService
undFacebookService
zuproviders
anderswo?