angular - 如何替换 Angular 组件中的服务实现?
问题描述
类的结构是:
/* 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
接口,这将调用服务。
我认为这是一个肮脏的解决方案,因为我通过每个实现的所有方法污染了组件。
解决方案
在模块中,您可以“提供”另一个要使用的类:
providers:[{ provide: Tree, useClass: AnotherTree }]
推荐阅读
- windows-server-2016 - 如何撤消在 Windows 2016 服务器上使用 FTPS 所做的更改
- python - Python 在 while 循环中重复我的语句
- c++ - 三元运算符中的错误,抛出错误:“预期的主表达式在';'之前 令牌“
- mysql - 相关子查询和 GROUP BY
- node.js - 先前查询最后一个文档后的 Firestore 查询?
- javascript - 使用 left + (right - left) / 2 计算中点会在偶数长度数组上返回小数 (.5)。那有什么好处?
- sql - 在 Laravel 中的 DB:raw 语句中添加 where 子句,以返回 deleted_at 为空的评论数
- reactjs - __webpack_require__ 未定义。这里地图包不起作用
- java - 将 Ant 构建脚本转换为 Maven 构建
- .net-core - 如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1