2016-11-04 242 views
1

在我的應用程序中,我有一個包含兩個組件的模塊,ListComponent和DetailsComponent以及一個服務MyModuleService。Angular 2服務依賴注入問題

當用戶訪問ListComponet時,我從服務器獲取列表並將其添加到服務的List屬性(然後我將其用作緩存)。

當用戶單擊列表中的任何項目時,它將轉到該項目的「詳細信息」頁面。

詳細信息組件我使用Next和Previous鏈接導航,我使用服務的List屬性來決定下一個和上一個項目。

如果用戶返回到列表頁面,則列表將從緩存中呈現,即從服務的List屬性中呈現。

我的列表組件還有一個搜索表單,它允許用戶指定搜索條件並從匹配該條件的服務器檢索項目。

問題是,如果我導航到沒有任何引用上面提到的MyModule,然後回到列表頁面的任何其他路由,然後回到列表頁面,它不刷新MyModuleService,這意味着它沒有銷燬Service實例。

可能是因爲MyModuleService被添加到全局依賴注入上下文中。

任何人都可以請引導,我如何限制服務的範圍只有一個模塊?所以當我導航到另一條路線時,它會銷燬MyModuleService實例。

+0

我很害怕在設計中不能將DI示波器限制爲單個模塊。你可以做的是讀取從你到達ListComponent的路線的URL,並根據這個決定是否刷新。 – Picci

回答

2

很可能是因爲MyModuleService被添加到全局依賴注入上下文中。

是和this is by design

限制的範圍,以所述模塊的方式是通過在模塊中使用「頂部部件」(如在給定的文檔鏈接所述),則providers陣列@Component裝飾的中宣佈服務:

@Component({ 
    selector: 'my-top-component', 
    providers: [ MyModuleService ] 
}) 
export class MyTopComponent { } 

這樣,MyModuleService範圍將被限制爲MyTopComponent及其子女。但由於MyTopComponent內部有兩個嵌套組件(ListComponentDetailsComponent),所以您也必須處理child routes

+0

謝謝羅德里戈,這是有幫助的:) –

+0

但它並沒有真正從內存中刪除服務...其他的想法? –

1

要向不同模塊提供不同的服務實例,請使用providers數組。

Module1: 

providers: [MyService] 

Module2: 

providers: [MyService] 

現在這兩個模塊都使用相同的服務的不同實例。

如果需要,您可以在組件級別聲明提供程序。這意味着該組件和任何子組件將具有該服務的單個實例的實例。

如果您希望整個應用只使用一次服務實例,然後將其提供給頂層模塊的提供者數組。