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 { ..... }