【问题标题】:How to replace service implementation in Angular component?如何替换 Angular 组件中的服务实现?
【发布时间】:2021-05-06 16:09:06
【问题描述】:

类的结构是:

/* Common class */

interface Tree {
}

class TreeBase {
   // Commmon methods for all successors
}

具体类:

interface TreeLayersActions { do(): void; }
interface TreeMapActions { make(): void; }

TreeLayers extends TreeBase implements TreeMapActions {
}

TreeMap extends TreeBase implements TreeLayersActions{
}

所以,我尝试将具体的实现注入到组件中:

export class TreeComponent implements OnInit, OnDestroy, TreeLayersActions, TreeMapActions {
   constructor(private tree: TreeBase) {

   }

         make(): void {
          this.tree.getNodeStyles(node); // Here problem
       }
       do(): void {}
}

问题是getNodeStyles 没有出现在private tree: TreeBase 中。因为它是具体的实现。

我试过这个:

constructor(private tree: TreeLayers | TreeMap) {
}

组件应该与不同的服务实现一起工作,以将执行委托给服务。

我决定创建一个服务来创建一个特定的树实例并实现所有具体类的所有接口:

class TreeService implements TreeLayerActions, TreeMapActions {
  public tree: TreeLayers | TreeSearch;

  constructor(type: string) {
      switch (type) {
      case "layers":
        this.tree = new TreeLayers(null);
        break;
      case "map":
        this.tree = new TreeSearch(null);
    }
 }

 /* Realization interfaces TreeLayerActions and TreeMapActions that deligates calls to service
 changeTileLayer(treeNode: TreeNode): void {
    this.tree.changeTileLayer(treeNode: TreeNode);
 }
 // Other methods
}

因此,我可以在组件中注入服务TreeService 并实现TreeLayerActions, TreeMapActions, Tree 接口,这将调用服务。

我认为这是一个肮脏的解决方案,因为我通过每个实现的所有方法污染了组件。

【问题讨论】:

  • export class TreeComponent implements OnInit, OnDestroy, Tree 类似于 OnInit 接口
  • 好的,但是要为服务指定什么类型?
  • 接口不能通过 DI 注入
  • 你能再检查一下我的问题吗?

标签: angular


【解决方案1】:

在模块中,您可以“提供”另一个类来使用:

providers:[{ provide: Tree, useClass: AnotherTree }]

【讨论】:

  • 可以,但是我不能注入接口Tree
  • 并且类 `AnotherTree` 有自己的方法,这些方法在 Tree 中没有提供。树只包含所有类的通用方法。如何知道组件内部什么是 AnotherTree 或另一个类?
  • 所以,我可以这样做:constructor(private tree: TreeA | TreeB | TreeC | TreeD) {} 组件不应该具体实现。
  • 但另一方面,如果我不知道注入的具体服务,我不知道它为组件提供了哪些方法,尽管 Tree 有常用方法
  • 创建一个抽象类 Tree 并让 TreeABCD 扩展它。然后你有构造函数(私有树:树),在你的子类中你将 TreeA 传递给 super()
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 2021-08-13
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2011-03-03
相关资源
最近更新 更多