为啥“(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?