2017-03-02 52 views

回答

1

服務通常很適合爲組件樹提供一樣的東西。例如,對於應用程序中的所有組件,Http服務通常都是相同的。想象一下,如果沒有服務這樣的事情。你必須重複使用相同的代碼片段,或者通過實現所使用的任何地方。應用程序中的每個組件都必須將HttpService作爲輸入傳遞給子組件。

輸入通常對另一件事物提供一件事情很好。例如,將完成%傳遞給進度條是父級和子級之間的緊密交互。想象一下,如果沒有投入這樣的事情。每次你想傳遞任何信息時,你都必須創建一個服務,甚至只需設置一個文本框的值即可。

注意事項:

如果您的組件的父母或用戶注意,就是BEING傳入的數據或功能的,或者是你的程序或組件樹的一部分區區方面?例如,OrderComponent可能取決於OrderServiceOrderComponent的父組件不應該知道OrderService(它不知道應該使用哪個OrderService,或者OrderService將使用哪個HttpService實現等),因此將它保留爲服務是有意義的。對於進度條,當然直接父母知道完成百分比。如果它不知道,爲什麼它甚至在那裏放進度條?

數據或功能是否直接與組件的用途相關?例如,HttpService的具體實現是任何OrderComponent的次要關注點,其主要工作是顯示訂單(但它是這樣做的),而完成百分比是進度條的主要關注點。

您的數據在運行時是否更改?更改輸入會觸發更改檢測,但服務中更改的原始值不會。服務通常具有不變的功能。如果服務中有數據並需要在組件中使用數據,則可以將BehaviorSubject或其他Observable用於該服務,並使用async管道將其值顯示在組件模板中。

您可能想讓組件期望服務,但是擔心同一父組件中的該組件的兩個實例將不得不共享相同的提供的服務實例。您可以通過在兩者之間創建另一個提供服務的組件來避免父組件向其所有子組件提供相同的服務。

更多組件交互這裏: https://angular.io/docs/ts/latest/cookbook/component-communication.html

1

這是一個很好的問題。我認爲答案的關鍵在於您是否想要一個與服務耦合的組件,或者您是否想要一個更易於配置且獨立運行的組件。

有兩種用例。例如,組件可能依靠服務來獲取其數據。關於這一點的好處是,從調用組件中配置的次數更少(您不必傳入數據 - 它只是可以直接使用)。另一方面,當您想要傳遞數據時,它使組件更少可插入。

沒有服務依賴性的組件獲取數據)可能更適用於各種其他環境。例如,不是依賴服務來獲取其數據,而是可以通過它的@Input屬性從父組件傳入數據。