每個組件都可以使用ComponentMetadata中的「providers」屬性指定新的提供者。如何在Angular 2中動態添加提供者到噴射器?
有沒有一種方法可以從組件的構造函數動態指定提供程序?
每個組件都可以使用ComponentMetadata中的「providers」屬性指定新的提供者。如何在Angular 2中動態添加提供者到噴射器?
有沒有一種方法可以從組件的構造函數動態指定提供程序?
我已經在bootstrap部分完成了它。
bootstrap(AppComponent,[
provide(RequestOptions, { useClass: DefaultRequestOptions }),
provide(Http, { useFactory:
function(backend, defaultOptions) {
return new Http(backend, defaultOptions); },
deps: [XHRBackend, RequestOptions]}),
]);
我猜它可以在太組件來完成:
https://angular.io/docs/ts/latest/api/http/Http-class.html
你讓它動態加入的決定進廠的功能,而不是僅僅返回相同的對象。
下面是您需要遵循的3個更廣泛的步驟來實現動態提供者。請注意我已經評論了許多代碼部分,以便我們關注主要答案。如果你想查看詳細的步驟請參考本Angular tutorial
第1步: - 創建提供商
的集合創建集合,你可以使用push方法添加DI動態對象。
var providerscoll:any = [];
providerscoll.push({ provide: "1", useClass: DialogLogger });
providerscoll.push({ provide: "2", useClass: ConsoleLogger });
第2步: - 在 「NgModule」 提供的供應商集合。
請參閱方括號語法。
@NgModule({
// code removed for clarity
providers: [providerscoll]
})
export class MainModuleLibrary { }
第3步: - 獲取噴油器對象的構造函數中使用DI構造
獲取注入對象,然後你可以看一下使用「get」方法和令牌。所以如果你提供「1」,那麼你得到的東西,如果你提供「2」,你會得到一些東西。
// code removed for clarity
import { Injector } from '@angular/core';
// code removed for clarity
export class CustomerComponent {
constructor(public injector: Injector){
this.logger = this.injector.get("2");
}
}
這很適合我的用例,但我不認爲它是可行的從組件內。 – Kugel
你試過了嗎? – Langley
現在2.0.0發佈後,這似乎不起作用。我一直在反對它試圖讓這個工作。 – amay0048