我正在构建一个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还是通过像上面一样声明属性?
答案 0 :(得分:1)
如果您希望Angular为您自动注入服务,它必须知道构造函数中的所有参数,这些参数将在注入过程中传递给它。现在,您有2个类型为number
的参数。 Angular对这个参数一无所知,所以为什么它不能注入它们并引发错误。因为您具有用于这些参数的set/get
函数,并且它们是原始类型,所以可以将它们作为已完成的属性。
为参数声明InjectionToken
并不是一个好的解决方案,因为在这种情况下,您的代码将无任何改进-您将声明其中两个,然后将它们再次传递给构造函数,但是您将不会调用该构造函数,它将执行Angular。因此,只需将它们声明为属性即可。
答案 1 :(得分:0)
将此添加到您的模块(要使用的组件的模块中):
import { YourService} from '../../providers/yourservice/yourservice.service';
providers: [
YourService,
]
导出类YourModule {}