如何在Angular 2中創建單件服務?我已經讀過,當引導應該讓所有孩子共享同一個實例時注入,但我的主要和頭部組件(主應用程序包括頭部件和路由器出口)都獲得了我的服務的單獨實例。我有一個FacebookService,用于調用facebook javascript api和一個使用FacebookService的UserService。這是我的引導程序:bootstrap(MainAppComponent, [ROUTER_PROVIDERS, UserService, FacebookService]);從我的日志記錄看起來,引導調用結束,然后我看到FacebookService然后在每個構造函數運行的代碼,MainAppComponent,HeaderComponent和DefaultComponent之前創建UserService:
3 回答

繁花不似錦
TA貢獻1851條經驗 獲得超4個贊
它是由依賴注入的工作方式引起的。它基于分層注入器。
Angular2應用程序中有幾個注入器:
引導應用程序時配置的根目錄
每個組件的注射器。如果您在另一個組件內使用組件。組件注入器是父組件1的子組件。應用程序組件(在您提升應用程序時指定的組件)將根注入器作為父注入器)。
當Angular2嘗試在組件構造函數中注入某些內容時:
它會查看與組件關聯的進樣器。如果有匹配的,它將使用它來獲取相應的實例。這個實例是懶惰創建的,是這個注入器的單例。
如果此級別沒有提供者,它將查看父級注入器(依此類推)。
因此,如果您希望為整個應用程序提供單例,則需要在根注入器級別或應用程序組件注入器上定義提供程序。
但Angular2將從底部查看注入器樹。這意味著將使用最低級別的提供程序,并且關聯實例的范圍將是此級別。
有關詳細信息,請參閱此問題:

叮當貓咪
TA貢獻1776條經驗 獲得超12個贊
我知道棱鏡有分層注射器,如蒂埃里所說。
但是我在這里有另一種選擇,以防你發現一個用例,你真的不想在父母那里注入它。
我們可以通過創建服務實例來實現這一點,并且提供始終返回的服務。
import { provide, Injectable } from '@angular/core';import { Http } from '@angular/core'; //Dummy example of dependencies@Injectable()export class YourService { private static instance: YourService = null; // Return the instance of the service public static getInstance(http: Http): YourService { if (YourService.instance === null) { YourService.instance = new YourService(http); } return YourService.instance; } constructor(private http: Http) {}}export const YOUR_SERVICE_PROVIDER = [ provide(YourService, { deps: [Http], useFactory: (http: Http): YourService => { return YourService.getInstance(http); } })];
然后在您的組件上使用自定義提供方法。
@Component({ providers: [YOUR_SERVICE_PROVIDER]})
你應該有一個單獨的服務,而不依賴于分層注入器。
我不是說這是一種更好的方法,以防萬一有人出現無法進行分層注射器的問題。
- 3 回答
- 0 關注
- 599 瀏覽
添加回答
舉報
0/150
提交
取消