【问题标题】:Service InjectionError Angular服务注入错误角度
【发布时间】:2019-01-11 11:16:18
【问题描述】:

我正在构建一个网络应用程序并创建了一个服务:

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 还是像我上面那样声明属性?

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      import { YourService} from '../../providers/yourservice/yourservice.service';
      
      providers: [
          YourService,
      ]
      

      导出类 YourModule {}

      【讨论】:

      • 不,这不起作用,正如@SurenSrapyan 所说,'Angular 对这个参数 [数字] 一无所知',因此将服务添加到模块不会有任何区别
      猜你喜欢
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2016-07-18
      • 2015-10-04
      • 2020-01-03
      相关资源
      最近更新 更多