อัปเดต (Angular 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
ที่อื่น?