Aktualizacja (Angular 6 +)
Zmienił się zalecany sposób tworzenia usługi singleton . Obecnie zaleca się określenie w @Injectable
dekoratorze w usłudze, że ma być ona udostępniana w katalogu głównym. Ma to dla mnie duży sens i nie ma już potrzeby wymieniać wszystkich usług świadczonych w Twoich modułach. Po prostu importujesz usługi, kiedy ich potrzebujesz, a one rejestrują się we właściwym miejscu. Możesz również określić moduł, aby był dostarczany tylko wtedy, gdy moduł jest importowany.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Aktualizacja (Angular 2)
W przypadku NgModule sposobem na zrobienie tego teraz, myślę, jest utworzenie „CoreModule” zawierającego klasę usług i wyświetlenie usługi u dostawców modułu. Następnie importujesz moduł podstawowy do modułu głównego aplikacji, który zapewni jedno wystąpienie każdemu dziecku żądającemu tej klasy w swoich konstruktorach:
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 { }
Oryginalna odpowiedź
Jeśli podajesz dostawcę w bootstrap()
, nie musisz umieszczać go w dekoratorze komponentów:
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) {}
}
W rzeczywistości umieszczenie Twojej klasy w grupie „dostawcy” tworzy jej nową instancję, jeśli jakikolwiek komponent nadrzędny już ją wymienia, wówczas dzieci nie muszą tego robić, a jeśli to zrobią, otrzymają nową instancję.
UserService
iFacebookService
doproviders
nigdzie indziej?