为啥“(SystemJS)无法解析所有参数”发生在Angular2中
Posted
技术标签:
【中文标题】为啥“(SystemJS)无法解析所有参数”发生在Angular2中【英文标题】:Why "(SystemJS) Can't resolve all parameters" happens in Angular2为什么“(SystemJS)无法解析所有参数”发生在Angular2中 【发布时间】:2017-05-03 10:09:09 【问题描述】:全部:
当我尝试构建一个简单的计数器服务时,我对 Angular2 还是很陌生:
从“@angular/core”导入 Injectable ;
@Injectable()
export class Counter
count = 0;
constructor(start = 0)
this.count = start;
// this.reset();
reset(start=0)
this.count = start;
inc()
this.count++;
dec()
this.count--;
show()
return this.count;
我在构造函数中尝试做的是设置一个默认初始化参数start
以默认计数为0,但我得到如下错误:
(SystemJS) 无法解析 Counter: (?) 的所有参数。
我的问题是:
这是因为 Angular2 将构造函数参数列表中的所有内容都视为依赖注入,不允许设置其他类型的参数,还是有其他原因导致此错误?我必须使用那个reset()
来达到同样的目的?
这对吗?
谢谢
【问题讨论】:
【参考方案1】:“这是因为Angular2会将构造函数参数列表中的所有内容都视为依赖注入”
是的。
您可以使用@Optional
来完成这项工作。但这将毫无意义,仅此而已。你什么时候会提供价值?所以它总是 0。毫无意义。
如果要为注入提供任意值,可以使用@Inject
并使用令牌配置值。例如
import OpaqueToken, NgModule from '@angular/core';
export const START = new OpaqueToken("some.token");
@NgModule(
providers: [
provide: START, useValue: 100
]
)
export class AppModule
现在你可以注入它并且让它成为可选的
import Inject, Optional from '@angular/core';
import START from './app.module';
constructor(@Optional @Inject(START) start = 0)
【讨论】:
谢谢,所以如果我需要一个值,我需要将它定义为一个值依赖。 是的,但也要考虑你是否真的需要从外部获取价值。如果没有,那么甚至不需要将它作为构造函数参数。或者也许这甚至可以添加到“常量”文件中,只需在需要的地方导入常量(而不是尝试注入) 得到它。顺便说一句,您能否详细说明一下为什么应该像 provide: START, useValue: 100
这样使用对象文字表示法,因为 START 已经有一个值,为什么我仍然需要给 useValue 一个值,以及如果我使用类似 provide: START, useClass: START
( 让我们现在说 START 是一个类)既然 START 是类名,为什么我们还需要在 provide 中指定 START?
START
只是令牌(它不是值)。令牌是 Angular 知道为@Inject
注入什么的方式。这不是价值。 100
是值。如果我们想做像 provide: SomeService, useValue: new SomeService()
这样的事情,我们提供一个value,它是服务实例,token 是类。如果我们使用useClass
,那么 Angular 需要一个类,它会尝试实例化自己。
我认为this post 可能还会提供更多说明以上是关于为啥“(SystemJS)无法解析所有参数”发生在Angular2中的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 URLSessionTask 完成后 indexPath 会发生变化?
当我在模型中使用 withAnimation 时,没有动画发生,为啥?
Java:为啥在使用 Stream+Iterator 时不会发生 ConcurrentModificationException?