2017-09-16 60 views
1

我想知道有什麼區別這兩個示例:Typescript/Angular 4:注入服務和初始化爲新類有什麼區別?

export class EditorComponent { 

    constructor(
     public _entryService: EntryService 
){ 
     console.log(this._entryService.entryData.properties); 
    } 

} 

export class EditorComponent { 

    _entryService; 

    constructor(){ 
    this._entryService = new EntryService; 
    console.log(this._entryService.entryData.properties); 
    } 

} 

是兩者之間有任何實際的區別嗎?

我預計在我對基本理論知識方面可能存在一些差距 - 任何能夠幫助我進行自我教育的方向的指針將不勝感謝,謝謝!

+2

'injecting'表示**單個實例**。 'instanctiating'意味着**創建多個實例**。對於'injectable()'服務來說,實例化是一種不好的做法。您可能最終面臨[**無法解析所有參數**](https://stackoverflow.com/questions/44996095/angular2-ionic2-cant-resolve-all-parameters-for-gameserviceprovider/44996310#44996310)錯誤 – Aravind

+0

注入服務並不總是導致一個實例。例如,如果在共享模塊的提供者部分內提供服務,則每次將模塊導入到另一個模塊時都會導致該服務的新實例,除非它是通過'NgModuleWithProviders'定義的,並且通過靜態方法([ DOCS](https://angular.io/guide/ngmodule#why-userservice-isnt-shared))。 – cyrix

+1

@cyrix您錯誤地解釋了文檔。你描述的行爲是指當另一個模塊有自己的注入器時,即延遲加載模塊的情況。這不會發生,如果一個模塊沒有延遲加載。 – estus

回答

2

this._entryService = new EntryService等效爲組件定義提供商:

@Component({ ..., providers: [EntryService] }) 
export class EditorComponent { 
    constructor(
     public _entryService: EntryService 
){} 
} 

這將創建每個每個組件實例新EntryService實例。

如果沒有提供者屬於組件噴射器,它將被從母體噴射器(可能是根噴射器)中檢索,並且將導致EntryService提供商的單個實例:

@Component({ ..., providers: [] }) 
export class EditorComponent { 
    constructor(
     public _entryService: EntryService 
){} 
} 

的唯一情況時new EntryService可取正時類構造函數接受非DI參數(如this example中所示)。

+0

EntryService不是你的情況下的單例,爲了使它成爲一個單例,你必須將它作爲一個單例實現。 – cyrix

+0

@cyrix它是單個注入器內的單例。如果提供者沒有在組件中定義並從定義它的父注入器中檢索,則它將是單例。這就是答案所說的。 – estus

+0

這不會使服務類成爲單例類,您仍然可以自己創建新的實例,這與單例模式相反。你想說的是,只有一個實例被創建並被模塊中的每個組件使用。 – cyrix

相關問題