2017-01-16 82 views
6

我是Angular的新手,對提供者重寫有疑問。我想在我的項目https://www.npmjs.com/package/mydatepicker中使用這個日期選擇器。Angular2我如何覆蓋提供者

我想重寫此庫的組件使用的區域設置提供程序。以下是示例https://plnkr.co/edit/fS8IoJqB8PYvgNEVGIMY

我從庫班(my.locale.service.ts)擴展LocaleService並想用它來代替它,所以我指定它在我的模塊中:

providers: [{provide: LocaleService, useClass: MyLocaleService }] 

但它不工作,組件仍然使用它自己的LocaleService。我怎樣才能做到這一點?

謝謝!

+0

這是否終於適合你?我一直在爲此掙扎一段時間,但沒有結果。 – Saram

回答

1

您的路徑似乎被錯誤地導入,並且您的服務文件需要位於src目錄中。

import {MyDatePickerModule} from "mydatepicker/dist/my-date-picker.module"; 
import {LocaleService} from "mydatepicker/dist/services/my-date-picker.locale.service"; 
import {MyLocaleService} from "./my.locale.service"; 

請參見下面的工作plunkr如果

https://plnkr.co/edit/e63S9dGXSc65BcKWMPnd?p=preview

+1

哦,謝謝!修復了我的掠奪者。所以現在的問題是如何用我自己的代替LocaleService庫的組件使用。 – igor

4

https://angular.io/guide/ngmodule-faq#what-if-two-modules-provide-the-same-service

兩個模塊提供同樣的服務?當同時加載的兩個導入的 模塊列出具有相同標記的提供者時,第二個模塊的提供者「勝利」 。這是因爲兩個供應商都將 添加到相同的噴油器。

當Angular看起來爲該令牌注入服務時,它會創建並提供由第二個提供者創建的實例 。

每個注入此服務的類都獲取由第二提供者創建的實例。即使在第一個模塊中聲明的類也會獲得由第二個提供者創建的實例 。這可能是令人不愉快的 驚喜。

如果模塊A爲標記'X'提供服務並導入模塊B 也提供標記'X'的服務,則模塊A的服務 定義爲「勝利」。

根AppModule提供的服務優先於導入模塊提供的服務 。 AppModule總是獲勝。

如果您在AppModule中提供提供商,則此提供商將用於導入模塊中提供的提供商。

對於懶加載的模塊,這是不同的。如果一個提供者被提供在一個延遲加載的模塊中,那麼這個模塊加載的組件和服務將會從延遲加載模塊的提供者那裏獲得依賴,即使它也是在AppModule中提供的。

+0

「兩個模塊提供相同的服務」在這裏不是挑戰; 「懶加載模塊」也不是。挑戰是模塊'A'輸入模塊'B';模塊'B'定義組件'Bc'; [組件'Bc'提供服務'Bs'](https://github.com/kekeh/mydatepicker/blob/master/src/my-date-picker/my-date-picker.component.ts#L32);模塊「A」如何改變提供給組件'Bc'的服務的實現?顯然**模塊**上的提供者,比如'A',不會**影響/覆蓋**組件**上的提供者,比如'Bc',甚至'A'中的組件'Ac'模塊? –