服务注入错误角度

时间:2018-08-03 14:22:08

标签: angular typescript

我正在构建一个Web应用程序,并且创建了一项服务:

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

@Injectable({
  providedIn: 'root'
})
export class ModuleService {

  constructor(private startTime: number = 8, private endTime: number = 12) { }

  get start() {
    return this.startTime;
  }

  get end() {
    return this.endTime;
  }

  set start(startTime) {
    this.startTime = startTime;
  }

  set end(endTime) {
    this.endTime = endTime;
  }
}

将其注入组件时,出现以下错误:

ERROR Error: Uncaught (in promise): Error: StaticInjectorError(AppModule)[Number]: 
  StaticInjectorError(Platform: core)[Number]: 
    NullInjectorError: No provider for Number!
Error: StaticInjectorError(AppModule)[Number]: 
  StaticInjectorError(Platform: core)[Number]: 
    NullInjectorError: No provider for Number!

当我从构造函数中删除属性时,它将起作用

export class ModuleService {
  startTime = 8;
  endTime = 12;

  constructor() { }

我在这里https://angular.io/guide/dependency-injection#non-class-dependencies读到,当它是非类依赖性时(我为数字),我必须注入InjectionToken。所以我的问题是最好的方法,是通过创建InjectionToken还是通过像上面一样声明属性?

2 个答案:

答案 0 :(得分:1)

如果您希望Angular为您自动注入服务,它必须知道构造函数中的所有参数,这些参数将在注入过程中传递给它。现在,您有2个类型为number的参数。 Angular对这个参数一无所知,所以为什么它不能注入它们并引发错误。因为您具有用于这些参数的set/get函数,并且它们是原始类型,所以可以将它们作为已完成的属性。

为参数声明InjectionToken并不是一个好的解决方案,因为在这种情况下,您的代码将无任何改进-您将声明其中两个,然后将它们再次传递给构造函数,但是您将不会调用该构造函数,它将执行Angular。因此,只需将它们声明为属性即可。

答案 1 :(得分:0)

将此添加到您的模块(要使用的组件的模块中):

import { YourService} from '../../providers/yourservice/yourservice.service';

providers: [
    YourService,
]

导出类YourModule {}