2016-10-03 29 views
2

這在文檔中非常混亂,因爲一部分建議在模塊提供程序數組中加載服務將使其可用於整個應用程序,並且如果我們需要隔離此服務唯一的方法是將其包含在頂級父組件的提供者中,而不是功能模塊提供者。Angular 2如何在功能模塊中隔離服務提供者

當模塊在應用程序啓動加載,其@ NgModule.providers 有應用範圍廣。在整個申請中它們可用於注射 。

如果可以,請加載模塊。 Angular 爲它自己的子注入器提供了一個延遲加載的模塊。模塊的 供應商僅在使用此注入器創建的組件樹內可見。

如果您必須加載模塊,應用程序啓動時, 代替提供組件中的服務。

https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-component-scoped-providers

在另一方面存在這樣說,否則的文檔另一部分以及用於隔離的服務,我們可以直接將其添加到模塊的供應商陣列,並且將它隔離到這個特定的功能模塊。

危機服務既不需要也不想在危機 中心域以外通緝。我們在CrisisCenterModule提供程序數組中註冊了CrisisService,而不是將其註冊到AppModule的提供商 - 這使得它在任何地方都可見。

這將CrisisService的範圍限制爲危機中心 路線。危機中心之外沒有其他模塊可以訪問它。

https://angular.io/docs/ts/latest/guide/router.html#!#child-routing-component

這概念是正確的?

+1

我碰到了第二次報價幾次,並想知道同樣的事情。就我個人而言,筆者認爲它可能是一個錯字,部分作者的腦部放屁,或者是從未更新的早期草稿。更清楚的是,我認爲第二個是錯誤的。如果'CrisisCenterModule'被延遲加載,那麼它就是正確的,但是1)它不是,2)它們沒有提到它被延遲加載。它的整個措辭使得它看起來像所有的模塊得到自己的範圍,這是不正確的 –

+1

我沒有看到它提到,但是當模塊被延遲加載,提供者不會成爲全球可用,只在範圍內懶加載模塊。 –

+0

peeskillet我認爲你是正確的路由器文檔之前有NgModule和NgModule FAQ部分,所以我認爲這是一個錯誤,只是想確保我沒有失去我的大腦。 –

回答

1

這兩個概念都是對的。在NgModule中定義一項服務會導致您可以使用該服務作爲單例。

但是,如果將服務定義爲獨立組件,則angular將創建該服務的新實例。

相關問題