簡體   English   中英

從庫注入器錯誤擴展角度類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM