2017-03-07 134 views
0

(很抱歉,下一段很難解析,我發現這在描述DI時總是會發生)。Angular2:實例級的依賴注入

我有一個現有的組件,稱之爲Widget

Widget通過ng2DI接收到Thingy。而Thingy又通過DI接收ThingyPart

現在我正在編寫一個新組件,稱之爲WidgetListWidgetList最終會進入循環並創建多個Widget s。這些Widget中的每一個的主要不同之處在於它們每個都需要將不同的ThingyPart注入到它們的Thingy中。 WidgetList,只有WidgetList,知道如何構造那些ThingyPart s,並且它需要當前循環變量來構造。

最終需要發生的是我需要爲每個循環迭代提供一個不同的ThingyPart。有沒有什麼辦法可以實現這一點,而不用觸摸Widget

替代問題:我注意到我可以在我的WidgetList中使用receive the raw Injector。有沒有辦法動態地添加和刪除我的viewchildren使用注入器API看到的子注入器?如果有,那麼我可以在循環中創建一個新的子注入器並刪除舊注入器。 (你知道什麼是酷嗎?一個「提供」模板指令,爲我做這個)

+0

是'Thingy'角度分量? – shusson

+0

不,它是@Injectable。只是一個服務 – masonk

+0

我會在'Thingy'上避開DI,並在'Widget'中實例化它。這聽起來像一個組合vs依賴關係問題http://stackoverflow.com/questions/21022012/difference-between-dependency-and-composition – shusson

回答

1

聽起來像在WidgetList組件中,你需要提供ThingyPart作爲工廠。然後,您可以使用WidgetList中的數據創建ThingyPart的實例。

例如。

@Component({ 
    selector: 'widget-list', 
    ..... 
    providers: [ 
     { provide: ThingConfigService, useFactory: (widget) => { 
     ... // use the Widget here to configure ThingConfigService as you need 
       // then you can use ThingConfigService within your ThingyPart 
       // and pull out the data that you need 
     }, deps: [ Widget ] 
     } 
    ] 
...... 

useFactory選項接受一個可以返回配置的ThingyPart的函數。沒有更多地瞭解你想要完成的事情,很難引導你。

Thoughtram has an article about dependency injection that may prove useful

+0

如何使用工廠方法內的WidgetList實例中的數據?工廠是我所看到的第一件事情,但工廠函數沒有任何用處:'​​this'沒有定義,除了父容器中可用的東西外,我無法獲得它,更不用說我真正需要的東西了,哪是循環變量。 – masonk

+0

https://plnkr.co/edit/CxMPf3?p=info plunker試圖展示你可以用useFactory選項做什麼。請注意,您必須提供一個服務,然後在useFactory函數中配置您需要的服務(您不能'提供'組件本身 - 我會更新我的答案以反映這一點) – snorkpete