2017-07-29 54 views
0

我是新來的打字稿,角度2和一個問題,我無法讓我的思想圍繞是。我認爲服務是一個文件或文件,這些文件或文件具有對許多組件都有用和常用的功能。所以最終使這些功能成爲中心,並因此在所有這些組件中使用。角度服務注入和導入對象之間的差異

所以我的問題是什麼是這些服務,他們必須注入時,我可以創建一個功能的對象文字,只是在組件中導入它們。我仍然可以使用我導入的對象調用這些功能。

+2

服務是單身,對象不是。如果某個組件更改了某個服務的某個屬性的值,則其他組件可以看到該值發生了更改,而如果某個組件更改了該對象的某個屬性的值,則只能看到該更改。 – Claies

+1

注入器允許重新實例化,替換或修改服務實例,而不更改定義或使用它們的文件,包括測試。這是不可能的進口,至少沒有黑客。這是任何DI容器的特點,並不是Angular特有的。 – estus

+0

謝謝你們,我想所有的答案都讓事情更加清晰:) – Jdsans

回答

1

放棄一個類的類型,只是使用它是完全有效的。然而,在角依賴注入機制,讓你實現同樣的事情,但也有一些額外的好處:

  • 實例可以是可以不同的地方 在聲明的作用域單身(應用程序,模塊,組件)
  • 您可以在@Inject構造函數參數中聲明一個基類或接口(通過注入令牌),然後配置將在您的模塊配置中注入哪個類
  • 角注入器具有很多靈活性,實例由注入器構建並交付
  • You c爲測試注入不同的類比運行時,這使得嘲笑測試服務非常容易
-1

要重申評論所說的話,服務的單個實例旨在跨多個組件/類使用。這是依賴注入完成的。例如,如果在多個組件使用的服務中有待完成的項目數組,則此列表在所有組件中都是相同的,因此如果一個組件添加到列表中,則所有其他組件都會看到此更改反映出來。

另一方面,導入對象文本會爲每個組件使用不同的實例。因此,在同一示例中,如果服務對象包含待辦事項項目的數組,則每個導入此對象的組件都將具有單獨的待辦事項列表,這些項目之間不會有任何關聯。

希望能夠澄清問題。

+1

我不同意你在第一段中的陳述。這取決於你如何注入服務。你描述了共享服務的情況,這是同一個實例。但是你可以在許多情況下注入數組,以便共享數組 – Vega

+0

它與應用程序組合有關,使用模塊vs使用類+ DI令牌,但都提供了平分共享狀態的能力。 –