Angular 2 DI错误 – EXCEPTION:无法parsing所有参数

我已经在Angular 2中构build了一个基本的应用程序,并遇到了一个奇怪的问题,我无法将服务注入到其中一个组件中。 它会把它们注入到我创build的其他三个组件中。

对于初学者来说,这是服务(这是非常基本的,因为我只是现在正在testing的东西):

import { Injectable } from '@angular/core'; @Injectable() export class MobileService { screenWidth: number; screenHeight: number; constructor() { this.screenWidth = window.outerWidth; this.screenHeight = window.outerHeight; window.addEventListener("resize", this.onWindowResize.bind(this) ) } onWindowResize(ev: Event) { var win = (ev.currentTarget as Window); this.screenWidth = win.outerWidth; this.screenHeight = win.outerHeight; } } 

而它拒绝使用的组件:

 import { Component, } from '@angular/core'; import { NgClass } from '@angular/common'; import { ROUTER_DIRECTIVES } from '@angular/router'; import {MobileService} from '../'; @Component({ moduleId: module.id, selector: 'pm-header', templateUrl: 'header.component.html', styleUrls: ['header.component.css'], directives: [ROUTER_DIRECTIVES, NgClass], }) export class HeaderComponent { mobileNav: boolean = false; constructor(public ms: MobileService) { console.log(ms); } } 

我在浏览器控制台中得到的错误是这样的:

例外:不能parsingHeaderComponent的所有参数:(?)。

我有引导function的服务,所以它有一个提供者。 我似乎可以将它注入到我的其他任何组件的构造函数中而没有问题。

有没有人看到明显的原因,为什么这不会工作?

从直接声明而不是桶中的文件导入。

我不知道究竟是什么原因导致了这个问题,但我多次提到它(可能是某种循环依赖)。

也应该通过改变桶中的出口顺序来解决(不知道细节,但也被提到)

除了之前给出的答案之外,当注入服务缺less实际的@Injectable()装饰器时,似乎也会抛出这个错误。 因此,在debugging循环依赖项和导入/导出的顺序之前,请检查您的服务是否实际上已经定义了@Injectable()

这适用于当前Angular最新的Angular 2.1.0。

我在这件事上开了个问题 。

从Angular 2.2.3 ,现在有一个forwardRef()实用程序函数,允许您注入尚未定义的提供程序。

通过未定义,我的意思是dependency injection映射不知道标识符。 这是循环依赖关系中发生的事情。 你可以在Angular中有循环依赖,很难解开和看到。

 export class HeaderComponent { mobileNav: boolean = false; constructor(@Inject(forwardRef(() => MobileService)) public ms: MobileService) { console.log(ms); } } 

@Inject(forwardRef(() => MobileService))到原始问题源代码中的构造函数的参数将解决问题。

参考

Angular 2手册:ForwardRef

在Angular 2中的前向引用

如前所述,这个问题是由循环依赖造成的桶内出口订单造成的。

更详细的解释在这里: https : //stackoverflow.com/a/37907696/893630

我也通过向服务B注入服务A来遇到这个问题,反之亦然。

个人而言, 我很高兴这个失败很快,因为它应该可以避免 。 如果您希望您的服务更加模块化/可重用,最好尽可能避免循环引用。 这篇文章强调了周围的陷阱。

因此:

  • 如果您觉得这些课程经常互动(我在谈论function嫉妒 ),您可能需要考虑将2个服务合并为一个课程
  • 如果上述不起作用,请考虑使用第三个服务 (一个EventService ),这两个服务可以注入以交换消息。

为了search者的利益; 我得到这个错误。 这简直是​​一个缺less的@符号。

即这会产生Can't resolve all parameters for MyHttpService错误的Can't resolve all parameters for MyHttpService

 Injectable() export class MyHttpService{ } 

添加缺less的@符号修复它。

 @Injectable() export class MyHttpService{ } 

如果服务A取决于服务B静态属性/方法 ,并且服务B本身依赖于服务A依赖关系注入,则会出现此错误。 所以它是一种循环依赖,虽然它不是因为属性/方法是静态的。 可能是与AOT结合发生的错误。

从注入构造函数()方法中删除参数解决了我的情况。

对我来说,这个问题更令人讨厌,我在一个服务中使用了一个服务,忘记把它作为依赖添加到appModule中! 希望这可以帮助别人节省几个小时的时间打破应用程序,只是为了重新build立它

我遇到了这个错误,错误的服务的名称,即构造函数(私人myService:MyService )。

对于拼写错误的服务,我可以通过在Chrome-> Console中检查页面来确定哪个服务是问题(我有几个在构造函数中列出)。 您将通过显示对象Object,object Object,将消息的一部分显示为“参数”数组列表。 (或类似的东西)。 注意哪里“?” 是,这是导致问题的服务的位置。

就我而言,这是因为我没有声明构造函数的types。

我有这样的事情:

 constructor(private URL, private http: Http) { } 

然后将其更改为下面的代码解决了我的问题。

 constructor(private URL : string, private http: Http) {} 

当使用桶import – 考虑首先input注射剂作为一个经验法则。

当引用一个interface也会发生这种情况。

更改class interface修复它,使用和不使用@Inject

您必须将供应商数组添加到@Component装饰器中或组件声明的模块中。 内部组件你可以做如下:

 @Component({ moduleId: module.id, selector: 'pm-header', templateUrl: 'header.component.html', styleUrls: ['header.component.css'], directives: [ROUTER_DIRECTIVES, NgClass], providers: [MobileService] }) 

有时候,当你在app.module.js中声明Angular的内置模块(HttpClientModule,HttpErrorResponse等)时会发生这种情况。 我也面临同样的问题,但现在解决。

我所做的错误是提供HttpClientModule到提供者,而不是angular度模块的导入

除了缺less@Injectable()装饰器

在抽象类中缺less@Injectable()装饰器产生了无法parsing服务的所有参数:(?)装饰器需要存在于MyService以及派生类BaseService

 //abstract class @Injectable() abstract class BaseService { ... } //MyService @Injectable() export class MyService extends BaseService { ..... }