[英]Angular Static Injector Provider error - but only when extending another injectable
[英]Extending angular class from library injector error
這個問題通常與擴展或替換組件庫中的組件有關。 我將使用一個示例。 我們有一個跨項目使用的組件庫,其中包含許多UI組件和指令。 這些組件可以即時翻譯。 這些小部件將注入翻譯服務,程序員指定要翻譯的鍵。 這里一切都很好。
假設此基本翻譯服務具有方法getTranslation()來使其保持簡單。
對於我們的大多數產品,基礎翻譯服務都是開箱即用的。 對於其他人,他們想使用其他版本。 我的第一個想法是定義一個接口,然后由基礎翻譯/其他項目的服務實現該接口(對於Spring Java人員來說是正常的)。 我正在閱讀有角度的樣式指南,說“考慮使用類而不是接口”。 我花了一段時間來了解原因(因為我的背景是Java),並且由於Angular DI注入的工作原理不同https://github.com/angular/angular/issues/19632 ,這很有意義。
因此,作為測試,在示例項目中,我創建了一個子類。
import { Injectable } from '@angular/core';
import { BaseTranslationService } from './base-translation.service';
@Injectable()
export class MyTranslationService extends BaseTranslationService {
constructor() {
super();
}
getTranslation(bundle: string, key: string, params?: any[]): string {
let translation = super.getTranslation(bundle, key, params);
return translation + ' from subclass';
}
}
雖然基礎翻譯服務上還有許多其他方法,但我只是想用一些沙盒工具替代上面的方法進行此測試。
最后,在使用項目中,我知道不再提供BaseTranslationService,而是提供新的:
providers: [ MyTranslationService, etc ]
這是行不通的。 我在所有需要BaseTranslationService的組件上收到此錯誤:
NullInjectorError:沒有BaseTranslationService提供程序!
看來DI並不了解MyTranslationService是否適用於BaseTranslationService。
應該行嗎? 我設置不正確嗎? 我是否誤解了樣式指南?
庫中的組件會尋找使用令牌BaseTranslationService
提供的服務。 但是您再也沒有這樣的令牌了。 您需要此:
providers: [ { provide: BaseTranslationService, useClass: MyTranslationService}, etc ]
根據評論進行更新,您應該使用@Injectable
裝飾器為類MyTranslationService
進行注釋,如下所示,
@Injectable()
export class MyTranslationService extends BaseTranslationService {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.