Perbarui (Sudut 6 +)
Cara yang disarankan untuk membuat layanan singleton telah berubah. Sekarang disarankan untuk menentukan di @Injectable
dekorator pada layanan yang harus disediakan di 'root'. Ini sangat masuk akal bagi saya dan tidak perlu lagi mendaftar semua layanan yang disediakan dalam modul Anda. Anda hanya mengimpor layanan ketika Anda membutuhkannya dan mereka mendaftarkan diri di tempat yang tepat. Anda juga dapat menentukan modul sehingga hanya akan disediakan jika modul diimpor.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Perbarui (Sudut 2)
Dengan NgModule, cara untuk melakukannya sekarang saya pikir adalah membuat 'CoreModule' dengan kelas layanan Anda di dalamnya, dan daftar layanan di penyedia modul. Kemudian Anda mengimpor modul inti dalam modul aplikasi utama Anda yang akan memberikan satu contoh untuk setiap anak yang meminta kelas itu dalam konstruktor mereka:
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 { }
Jawaban Asli
Jika Anda mendaftar penyedia bootstrap()
, Anda tidak perlu mendaftarkannya di dekorator komponen Anda:
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) {}
}
Bahkan mendaftarkan kelas Anda di 'penyedia' menciptakan instance baru, jika ada komponen orang tua yang mencantumkannya maka anak-anak tidak perlu, dan jika mereka melakukannya mereka akan mendapatkan instance baru.
UserService
danFacebookService
keproviders
tempat lain?