2017-03-02 33 views
2

在angular2有可能在一個@Component元素定義提供商等在@Component和@Module中注入提供者之間Angular2有什麼區別?

@Component({ 
    selector: 'app-home', 
    templateUrl: './home.component.html', 
    styleUrls: ['./home.component.css'], 
    providers : [ DataService ] 
}) 
export class HomeComponent implements OnInit { 

... 
} 

以及在一個

@NgModule({ 
    declarations: [ 
    ... 
    ], 
    imports: [ 
    ... 
    ], 
    providers: [ DataService ], 
    bootstrap: [AppComponent ] 
}) 
export class AppModule { } 

是什麼在@NgModule或在限定的提供者之間的差@零件?如果我應該選擇其中之一,那麼應該怎樣更好地定義供應商?

回答

3

角度應用程序是一個組件樹。每個組件都有其自己的注射器。因此,你有一個注射器樹。假設你有以下設置:

AppComponent 
/   \ 
C1   C2 
      /\ 
      C3 C4 

現在,如果你定義任何@NgModule內供應商(除了一個,這是懶加載),你就可以訪問該提供商在任何成分( C1, C2, C3, C4)。如果您在@Component中定義供應商,例如在C2中,則只有C2及其子女C2將能夠訪問該供應商。但即使這是可配置的。您可以使用其他修飾器,如@Self來搜索組件聲明的依賴項。

3

@NgModule: 服務將是模塊注入服務(在構造函數中)的子組件內的單例。

@Component:服務將是組件及其子組件中的單例。

來源:https://angular.io/docs/ts/latest/guide/dependency-injection.html#when-to-use-the-ngmodule-and-when-an-application-component-

何時使用NgModule和當一個應用程序組件?

一方面,NgModule中的提供者在根注入器中註冊。這意味着每個在NgModule中註冊的提供者都可以在整個應用程序中訪問。

另一方面,註冊在應用程序組件中的提供程序僅在該組件及其所有子級上可用。

3

區別在於範圍。

實際上

  • 「注入」 是添加一個參數來構造。
  • 它添加到providers: [...]是「提供」

在組件提供將導致多個實例

如果供應商在組件註冊,你會得到供應商的潛在的多個實例值(服務實例),因爲有組件實例。 「可能」,因爲如果有提供者,但它從未實際注入,則不會創建任何實例。

仰視提供商

當DI創建部件,指令,管道或服務實例,它檢查提供商構造參數的當前噴射器。 如果注射器沒有提供者,它會檢查父注射器直到找到提供者或沒有父注射器。

注入器hieararchy 在(非延遲加載)模塊中註冊的提供者被添加到根注入器。延遲加載模塊的注入器是一個子注入器。 AppComponent的注射器也是根注射器的兒童注射器。 每個子組件或指令都會獲得父組件注入器的子注入器。

增加了供應商的組件或指令

這意味着,當你在組件上提供服務,這個組件和其子組件與此組件註冊的供應商得到一個實例。在其他地方沒有提供者將被發現,因此實例創建將失敗。

如果這個組件有多個實例,那麼每個組件(帶有它的後代)將得到這個服務的不同實例。

添加提供程序模塊

如果供應商在@NgModule()註冊(非延遲加載),每一個組件和服務會發現這個供應商,同一個實例將無處不注入。

添加提供程序將延遲加載模塊

如果供應商在延遲加載模塊的@NgModule()註冊,那麼該服務將只可通過該模塊加載的組件和服務。

相關問題