如何解决“无法解析DynamicDatabase的所有参数:(?)。”

时间:2019-01-05 22:24:07

标签: angular dependency-injection

我正在尝试向我的项目中添加组件-“树动态示例” 你可以在这里看到它: https://stackblitz.com/angular/eaaramngjoqq?file=app%2Ftree-dynamic-example.ts

现在,如果您转到此站点并添加这样的新服务:

import { Injectable } from '@angular/core';

@Injectable()
export class NewService {

  constructor() { }

}

,然后转到tree-dynamic-example.ts并添加此行 (构造函数(私有newService:NewService){} ),就像这样:

export class DynamicDatabase {

constructor(private newService: NewService){}

dataMap = new Map<string, string[]>([
    ['Fruits', ['Apple', 'Orange', 'Banana']],
    ['Vegetables', ['Tomato', 'Potato', 'Onion']],
    ['Apple', ['Fuji', 'Macintosh']],
    ['Onion', ['Yellow', 'White', 'Purple']]
  ]);

它将告诉您: 无法解析DynamicDatabase的所有参数:(?)。

我检查了有关此主题的问题,但没有帮助- 我没有忘记在@injectable()中写@或() 我在项目中的这一行添加了app.module.ts:

@NgModule
.
.
providers: [NewService] 

但我一直收到此错误。

p.s。我对angular还是有点陌生​​,所以也许我忘了一些基本知识,将不胜感激

1 个答案:

答案 0 :(得分:1)

这个问题似乎与您试图将服务注入类同时应该将其注入组件或指令直接相关。如果您将它放在装饰器https://stackblitz.com/edit/angular-a6m76r?file=app/tree-dynamic-example.ts

的类中,则它会起作用

但是,如果您需要在普通类中提供服务,则可以手动实例化您的服务(在第一类中选中ser)。当您使用constructor(private service: Service)时,Angular会为您创建该服务的实例(如果您使用@Injectable({provideIn:'root'}),则使用全局服务。

Service只是一个带有装饰器的类,它可以帮助Angular解决DI(依赖项注入)。因此,除非要使用静态方法,否则在类中使用它需要您手动创建该服务的实例。


TL; DR;

1个案例-您需要在组件中维修

@Component(...)
export class Component {
  constructor (private service: Service) }
}

Angular通过DI为您创建服务的实例。

2种情况-您要在课程中使用服务

export class BaseClass {
  private service;

  constructor() {
    this.service = new Service();
  }
}

没有装饰器,因此Angular无法为我们解析DI,因此我们在构造函数中创建了服务的实例(就像我们要使用实际上是服务的传统类一样)。