3 回答

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

TA貢獻1776條經驗 獲得超12個贊
我知道棱鏡有分層注射器,如蒂埃里所說。
但是我在這里有另一種選擇,以防你發(fā)現(xiàn)一個用例,你真的不想在父母那里注入它。
我們可以通過創(chuàng)建服務實例來實現(xiàn)這一點,并且提供始終返回的服務。
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]})
你應該有一個單獨的服務,而不依賴于分層注入器。
我不是說這是一種更好的方法,以防萬一有人出現(xiàn)無法進行分層注射器的問題。
- 3 回答
- 0 關注
- 598 瀏覽
添加回答
舉報